这是我参与「第四届青训营 」笔记创作活动的第6天
数据存储&网络通信
本堂课内容
背景:
有大量的信息流内容,需要满足
- 信息流的数据,要能无线刷新
- 每次冷启,要能快速的展示信息流的内容
- 网络请求
- 数据存储
知识点介绍
网络通信
| 请求方式 | 包体积增量 | 使用成本 | 特点 | 使用场景 |
|---|---|---|---|---|
| HttpURL | 0KB | 2n | 需要自己做封装,如线程池管理,返回的数据解析 | 只有少量网络请求的工具类APP |
| Volley | 57KB | n | 适合网络请求频发,数据传输量小 不适合用来上传和下载文件 已经停止更新 | 无需下载大文件的APP |
| OkHttp | 262KB | 1.5n | 可以设置拦截器,支持大文件的上传和下载; 基于NIO和Okio性能更好; 一般需要二次封装使用 | 一般使用较少 |
| Retrofit | 343KB | 2n | 具备Okhttp所有的优点,且更加出色 restful api 设计风格 通过注解配置请求,包括请求方法、请求参数、请求头 支持Gson、jackson |
Retrofit
是目前Android平台上最热门的网络请求封装框架,是对OKHttp的一个封装框架
-
Retrofit包引入,在module中引入即可
-
创建用于描述网络请求的接口
定义说明:
- 接口类名:可自定义,尽量与这类请求的含义相关
- 函数名:可自定义,需要能识别出该接口的作用
- @GET注解,用于制定该接口的相对路径,并采用Get方法发起请求
- @Path注解,需要外部调用时,传入一个uid,该uid会替换@GET注解里相对路径的uid
- 返回值:自动转为所需要的类
-
发起网络请求
- 创建Retrofit实例
- 创建请求接口的实例,并获取到Call实例
- 调用call.enqueue进行异步请求
- 处理返回的数据
主要流程
- 通过Builder模式,创建RetrofitConfig,保存baseURL等内容
- 创建动态代理对象
- 创建OkHttpCall
- 发起网络请求
TTnet
优点
- 基于Retrofit改造,具备了其所有优点
- 支持多个Http网络库的动态切换
- 支持网络拦截配置:添加公共参数,动态切换协议以及Host,动态选路
- 支持流解析,json序列化
注解
生命周期
- SOURCE:只有在源码阶段有效,编译阶段抛弃
- CLASS:编译class文件时有效,一般会使用到注解处理器
- RUNTIME:在运行期间,获取对应的注解,并做相关的处理
数据存储
| 存储方式 | 特点 | 使用场景 |
|---|---|---|
| SharePreferences | 只能存boolean、int、float、long、String简单类型 键值对存储 | 记录app 的各种配置信息 |
| 文件存储 | 可以存各种格式的文件到手机中 默认情况下文件不能跨APP存储 | 网络下载的zip TXT文件的存储 |
| ContentProvider | 可以跨APP进行数据共享 通过Url对象进行访问 | 音视频,图片等读写 |
| SQLite | 可存储结构化数据 对数据进行增删改查较为方便 | 保存feed流数据,并进行增删改查 |
数据库
相对来说,数据库的使用会比较复杂,ObjectBox包增量大,使用成本低,且功能较少。
Room包增量小,功能多,Google背书。
Room
是Jetpack之中的一部分,在SQLite上提供了抽象层,可以充分的利用SQLite,流畅的访问数据库
主要的三个组件
- 数据库类,用于保存数据库并且作为应用持久性数据底层连接的主要访问点
- 数据实体,用于表示应用的数据库中的表
- 数据访问对象,提供应用可以用于查询、更新、插入和删除数据库中的数据和方法
Room接入
- 在Gradle文件里导入
- 数据表设计
- 新建Entity:定义一个User数据实体,User的每个实例都代表APP数据库中的user表中的一行
- 新增DAO:定义一个名为UserDao的DAO用来对User表的增删改查
- 新建数据库类
- 新增一个RoomDatabase的abstract子类
- 子类需加注解@Database(entities=[], version=n), entities包含数据实体,将会在这个数据库中创建对应的表,version是数据的版本号
- 对于与数据库关联的每个DAO类,数据库类必须定义一个无参的抽象方法,并返回DAO类实例
- 获取dao对象,即可进行数据库的增删改查操作
核心
- 编译期,通过kapt处理@Dao,@Database注解,动态生态对应的实现类
- 底层使用Android提供的SupportSQLiteOpenHelper实现数据库的增删改查等操作
课后个人总结
今天学习了和网络通信与数据存储的有关知识,通过学习我了解到了目前主流的网络框架以及它们各自的优缺点,主要了解了Retrofit的用法和简单的原理,包括字节所在此基础上开发的TTNet的相关内容。并且学习了数据存储的相关内容,包括常见的数据存储方式,以及最受欢迎的Room数据库框架的使用以及简单原理。