网络通信:我们一般都是通过网络请求来获得App内容
- 网络库开源框架对比
- HttpURLConnection:需要自己做封装,例如线程池管理、返回的数据解析。只有少量网络请求的工具类APP
- Volley:比较适合网络请求频繁,同时传输数据量小,不太适合上传文件和下载,现已停更。
- OkHttp:可以设置拦截器,支持大文件上传和下载,基于NIO和Okio,性能更好,一般需要二次封装使用。很少直接使用,可以搭配Volley或Retrofit
- Retrofit:它具备OkHttp所有的优点,更加出色。1.restful api设计风格2.通过注解配置请求(请求方法,参数,头等)3.可以搭配多种Converter将获得的数据解析,支持Gson、jackson、Protobur等。
- Retrofit介绍
目前Android平台上最热门的网络请求封装框架,对OkHttp的一个封装
使用方法
1. 在需要用到Retrofit接口的module中,新增依赖‘com.squareup.retrofit:2.4.0’
2. 创建用于描述网络请求的接口
- 接口类名:可自定义,尽量和这类请求的含义相关 (IUserInfoService)
- 函数名:自定义,需要识别出该接口的作用,接口中可以增加多个不同的函数(getUserName)
- @GET注解:用于指定该接口的相对路径,并采用Get方法发起请求
- @Path注解:需要外部调用时,传入一个uid,该uid会替代@GET注解里的相对路径的{uid}
- 返回值Call<ResponseBody>:这里用ResponseBody,我们可以直接拿到请求的String内容
来源:青训营课件
3. 发起网络请求
- [3.1 ] 创建Retrofit实例
- [3.2 ]创建请求接口的实例
- [3.3 ]调用call.enqueue进行异步请求
来源:青训营课件
注解类型
来源:青训营课件
TTNET介绍->字节跳动的网络库,与Retrofit基本一致
原理:基于Retrofit进行二次开发
替换掉底层的OkHttp,改为自研的Cronet
优点
- 基于Retrofit改造,具备了Retrofit所具有的优点
- 支持多个Http网络库的动态切换(okhttp和cronet)
- 支持网络拦截配置:添加公共参数,动态切换协议及Host,动态路选等...
注解介绍:Retrofit用到了非常多的注解。
注解可以理解为是一个标签,这个标签可以加在类,方法,参数,成员变量上,
并且可在合适的时机读取注解的内容,进行处理。
举例:
@Override:标注一个方法是重写了父类的实现
@Nullable:标注所描述的对象有可能为空
注解的处理:一般有三个时机(也就是注解的生命周期@Retention)
SOURCE:只有在源码中有效,编译时抛弃,例如@Override
CLASS: 编译class文件时有效,一般使用到注解处理器
RUNTIME :在运行期间,获取对应的注解,并做相关的处理
*.java-->*.class-->*.dex-->*.apk-->runtime
注解的获取和使用:通过反射获得Method对象后,有以下一些接口来获取注解内容
1. Method.getGenericReturnType()获取返回类型
2. Method.getAnnotations()获取方法的注解
3. Method.getParameterAnnotations()获取参数注解
来源:青训营课件
**Retrofit是在运行期间,配合Java动态代理,获取方法和参数的注解,并构造Request对象的**
来源:青训营课件
Retrofit主流程
1.通过BUilder模式,创建RetrofitConfig,保存baseUrl等内容
2.创建动态代理对象
3.创建OkHttpCall
4.发起网络请求
来源:青训营课件
Retrofit调用OkHttp
在主流程图中,okhttp网络库的api,在Retrofit中是何时发起请求的,对应的api已列出,相同颜色即意味着调用关系。
绿色代码:标记1处,创建Retrofit对象时,对应的创建了OkHttpClient对象
红色代码:标记4处,使用Retrofit的Call对象发起请求时,对应创建OkHttp网络库中Request网络库中Request对象和Call对象并发起请求
网络通信总结
来源:青训营课件
数据存储
- 数据存储方式对比
我们希望数据拥有持久性,就是在应用被杀死的情况下,我们的数据仍然会存在不会被清除。
因此我们根据不同场景的需求,有四种常见的数据存储方式
来源:青训营课件
- 数据库框架对比
几个主流数据库框架对比
来源:青训营课件
- Room数据库使用介绍
主要三个组件
1.数据库类(DataBase),用于保存数据库并作为应用持久性数据底层连接的主要访问点
2.数据实体(Entity),用于表示应用的数据库中的表
3.数据访问对象(DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。
Room实践案例Room接入
1.Gradle目录的build.gradle文件添加
来源:青训营课件
2.设计数据库表
3.新建Entity:定义一个User数据实体,User的每个实例都代表App数据库中的user表的一行
【注意】所有的属性必须是public、或者有get/set方法
@PrimaryKey:表示单个主键,当主键为null且autoGenerate为true时可以帮助自动生成键值
@ColumnInfo:列名的注解
4.新增DAO:定义一个名为UserDao的DAO。用来对User表的增删改查
5.新建数据库类,进行数据库配置,并需要满足以下几个条件
【5.1】新增一个RoomDatabase的abstract子类
【5.2】子类需加注解@Database(entities=[xxx],version=n),entities包含数据实体,将会在这个数据库中创建对应的表,version是数据的版本号
【5.3】对于与数据库关联的每个DAO类。数据库必须定义一个无参的抽象方法,并返回DAO类实例
6.获取dao对象,即可进行数据库的增删改查操作
- Room数据库原理介绍
核心
1.编译期,通过kapt处理@Dao、@Database注解,动态生成对应的实现类
2.底层使用Android提供的SupportSQLiteOpenHelper实现数据库的增删改查操作
Kapt注解处理
Room在编译期,通过Kapt处理@Dao、@Database注解,生成DAO和Database的实现类
AppDatabase-->AppDatabase_Impl
UserDao-->UserDao_Impl
数据存储总结
来源:青训营课件