这是我参与「第四届青训营」笔记创作活动的第4天
数据存储&网络通信
网络通信
App内容的获取,都是通过网络请求,是APP的基础能力
网络库开源框对比
- 1.HttpURLConnection:谷歌自带的包,包体积容量:0kb,使用成本较高:2n,需要自己做封装,例如线程池管理,返回的数据解析,只有少数网络请求的工具类APP使用。
- 2.Volley:谷歌开发的,包体积容量:57kb,使用成本:n,适用于网络请求频繁,传输数据量小的场景,不适合用来上传文件和下载(不支持输入输出流),已停更,使用场景:之前使用Volley,且无需大文件下载的APP
- 3.OkHttp:Square公司开发,包体积容量:262kb,使用成本:1.5n,可以设置拦截器,支持大文件上传和下载,由于其基于NIO和Okio性能好,一般需要二次封装使用,使用场景:一般比较少直接使用,可搭配Volley或Retrofit
- 4.Retrofit:Square公司开发,包体积容量:343kb,使用成本:2n,具备OkHttp所有的优点,且更出色。restful api设计风格,通过注解配置请求,包括请求方法,请求参数,请求头等,可以搭配多中Converter将获取的数据解析,支持Gson、jackson、Protobur等,使用场景:团队内有研发人员对Retrofit比较熟悉时可用
常用框架Retrofit
Retrofit是对OkHttp的一个封装
使用方法:
- 1.Retrofit库的引入
- 2.创建用于描述网络请求的接口
- 3.使用Retrofit实例发起网络请求 使用介绍:
1.在需要用到Retrofit接口的module中,新增依赖
dependencies{
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
//...其他依赖
}
2.创建用于描述网络请求的接口
interface IuserInfoServise{
@get("users/{uid}/name")
fun getUserName(@Path("uid") uid: Int): Call<ResponseBody>
//后续可以增加其他的接口,一个接口对应一个api请求
}
定义说明:
- 接口类名:可自定义,尽量和这类请求的含义相关
- 函数名:可自定义,需要能识别出该接口的作用,该interface里可以增加多个不同的函数
- @GET注解:用于指定接口的相对路径,并使用Get方法发起请求
- @Path注解:需要外部调用时,闯入一个uid,该uid会替换@GET注解里相对路径的{uid}
- Call <ResponseBody:这里用ResonseBody,我们可以直接拿到请求的String内容,如果要自动转化为Model类,例如User,这里直接替换为User就好。
3.发起网络请求
- 1.创建Retrofit实例
- 2.创建请求接口的实例,并获取到Call实例
- 3.调用call.enqueue进行异步请求
注解:
可以理解为一种标签,可以加载类、方法、参数、成员变量上、并且可在合适的实际读取注解的内容,进行处理
例如常见的:
- @Override:标注一个方法使重写了父类的实现
- @Nullable:标注所描述的对象有可能为空 retorfit中注解类型:
字节内部框架TTNET
既支持Retrofit又支持Cronet
优点:
- 1.基于Retrofit改造,具有Retrofit所有的优点
- 2.支持多个Http网络库的动态切换
- 3.支持网络拦截配置:添加公共参数,动态切换协议及Host,动态选路等
- 4.支持流解析,json序列化
数据存储
了解本地存储的4大方式和使用场景,重点了解Room数据库
数据存储方式对比
常见的数据存储
数据库框架对比
Room数据库使用介绍
Room是Goole Jetpack家族里的医院,Room在SQLite上提供了一个抽象层,以便在充分利用SQLite的强大功能的同时,能够流畅的访问数据库
主要组件:
- 1.数据库类(Database):用于保护数据库并作为应用持久性数据底层连接的主要访问点
- 2.数据实体(Entity):用于表示应用的数据库中的表
- 3.数据库访问对象(DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。
使用方法: 1.Room接入
①Gradle目录的build.grable文件里添加:
dependencies{
def room_version - "2.4.2"
implementation "androidx.room:room-runtime:$room_version"
kapt :androidx.room:room-compiler:$room_verion"//注解处理器
//...其他依赖
}
②数据表设计
③新建Entity:定义一个User数据实体,User的每个实例都代表App数据库中User表的一行
注:
- 1.所有属性必须是public、或者有get、set方法
- 2.@PrimaryKey:表示单个主键,当主键值为null且autoGenerate为true时可以帮助自动生成键值
- 3.@ColumnInfo:列名的注解 ④新增DAO:定义一个名为UserDao的Dao。用来对user表的增删改查 查:注解Query
⑤新建数据库类,进行数据库配置,并需满足以下几个条件:
- 1).新增一个RoomDatabase的Abstract子类
- 2).子类需要加注解#Database(entities = [xxx],version = n),entities包含数据实体,将会在这个数据库中建立对应的表,version是数据的版本号
- 3).对于与数据库关联的每个Dao类,数据库类必须定义一个无参的抽象方法,并返回DAO类实例
⑥获取dao对象,即可进行增删改查
Room数据库原理介绍
核心:
- 1.编译期,通过kapt(注解处理器)处理@Dao、@Database注解,动态生成对应的实现类
- 2.底层使用Android提供的SupportSQLiteOpenJelper实现数据库的增删改查等操作
标题:数据存储&网络通信|青训营笔记