这是我参与「第四届青训营 」笔记创作活动的第5天
欢迎关注微信公众号《猿小龙》,为您分享更多编程知识,共同进步!
1.Android 网络通信
1.1 网络库开源框架对比
1.3 Retrofit快速使用
- Retrofit库的引入
- 创建用于描述网络请求的接口
- 使用Retrofit实例发起网络请求
1.4 Retrofit使用介绍
- 假设:客户端知道了一个用户的UID,想通过服务端查询该用户的姓名,通过Retrofit如何实现呢?
- 接口:wwww.bytedance.com/users/{uid}…
- 其中:{uid}是要替换为实际的uid,如1124,最终请求为:wwww.bytedance.com/users/1124/…
- 类型:GET请求
- 接口返回:
{
"message":"success",
"data":{
"uid":1124,
"first_name":"胡",
"last_name":"哥"
}
}
- 在需要使用Retrofit接口的moudle中新增依赖,最新版依赖:github.com/square/retr…
- 创建用于描述网络请求的接口
定义说明:
- 接口类名:可自定义,尽量和这类请求的含义相关
- 函数名:可自定义:需要识别出该接口的作用,该interface中可以添加多个不同的函数
- @GET注解:用于指定该接口的相对路径,并采用GET方法发起请求
- @PATH注解:需要外部调用时,传入一个UID,该UID会替换@GET注解中相对路径中的UID值
- 返回值Call< ResponseBody>:这里用ResponseBody,我们可以直接拿到请求的String内容,如果要自动转换为Model类,例如User,这里直接替换为User就好
- 发起网络请求
- 创建Retrofit实例
- 创建请求接口的实例,并获取到Call实例
- 调用Call.enqueue,进行异步请求
- 处理返回的数据
1.5 注解类型
- 在刚才的IUserInfoService中,有@GET和@PATH,使用了其中一部分注解类型,将多种注解进行组合将会产生丰富的功能
1.6 Cornet与OKhttp的区别
- Cornet相比OKhttp做了不少优化,如请求成功率和网络延时方面
- 但是Cornet使用C++编写,不方便直接使用,需要进行二次封装
1.7 网络库TTnet
- 字节跳动大部分APP均在使用
- 优点
- 基于Retrofit进行改造,具备其所有优点
- 支持多个Http网络库的动态切换(OKhttp和cornet)
- 支持网络拦截配置,添加公共参数,动态切换协议及Host,动态选路等
- 支持流解析,json序列化
1.8 Retrofit和TTnet简单用法对比
- Retrofit
- TTnet
1.9 TTnet是如何把Retrofit底层的OKhttp进行改造的呢?
- 先进行梳理Retrofit是如何封装和使用OKhttp进行发起网络请求的
- 既然TTnet是基于Retrofit进行修改的,那么可以在使用OKhttp的地方替换为Cornet来进行发送网络请求
1.10 注解介绍
- 注解,可以理解为一个标签,这个标签可以加在类、方法、参数、成员变量上去,并且在合适的时机读取注解的内容进行处理
- 例如:
@Override:标注一个方法是重写了父类的实现;@Nullable:标注所描述对象可能为空
- 例如:当我们定义描述请求接口的方法时:有想修饰方法名的
@GET,和修饰参数的@PATH
- 有定义和使用注解的地方,那么也就会有获取注解内容并处理注解内容的地方,一般有一下3个时机:
- SOURCE:只有在源码中有效,编译时被抛弃,如@Override
- CLASS:编译CLASS文件时有效,一般会使用注解处理器
- RUNTIME:运行期间,会获取相应的注解,并做相关处理
- Retrofit注解:
@GET定义@Target:指定作用的对象,这里是METHOD,说明这个注解作用在方法上,还包括其它枚举值。@Retention:指定注解的生命周期,这里是RUNTIME,说明这个注解要一直保留到运行时刻
- 注解的注释或获取:
- 通过反射获取到Method对象后,通过一下接口获取注释内容
Method.getGenericReturnType()获取返回类型Method.getAnnotations()获取方法的注解Method.getParameterAnnotations()获取参数注解
- Retrofit是在运行期间,配合Java动态代理,获取方法和参数的注解,并构造Request对象,
- Java动态代理,Proxy.neeProxyInstance
- 利用Java的反射技术(Java reflecttion)代理某个interface,一旦调用interface内的某个方法,实际通过代理去调用InvocationHandler的invoke方法
- 通过Method对象,就可以调用Methon.getAnnotations()和Method.getParameterAnnotations()来获取该方法和该方法的注解内容
1.11 Retrofit主要流程
- 重点:OKhttp的创建和调用(绿色)
- 主要流程
- 通过Builder模式,创建RetrofitConfig,保存BaseURI等内容
- 创建动态代理对象创建OKhttpCall
- 发送网络请求
1.12 Retrofit调用OKhttp
- 在主流程图中,OKhttp的网络库的api,在Retrofit中是何时发起请求的,对应api已经列出,相同颜色及意味着调用关系
- 红色代码:标记4处,使用Retrofit的Call对象发起请求时,对应创建OKhttp网络库中Request对象和Call对象并且发起请求
- 绿色代码:标记1处,创建Retrofit对象,对应创建了OKhttpClient对象
1.13 Retrofit中OKhttpClient对象的创创建时机
- Retrofit的BUilder构造行中,如果没有指定CallFactory,则会自动创建一个OKhttpClient
- PS:有一个adapterFactories集合里面包含一个默认的CallAdapter.Factory,它是子类ExecutorCallAdapterFactory的实例
- 创建好的OKhttpClient将会保存在Retrofit实例中
- ExecutorCallAdapterFactory主要用来控制Retrofit在子线程中触发请求,在主线程中回调结果
1.14 OKhttpCall的创建
- 当我们通过代理对象调用调用我们的接口方法时,IUserIfoService#getgerUserName()方法时,会触发InvocationHandler#invoke方法
- 这里看到Retrofit写死了,仅支持OKhttp
1.15 TTNet类图设计
- 核心:
- 替换底层用到的OKhttpClient
- 替换底层用到的OKhttpCall