第五期:Android数据存储&网络通信(一)|青训营笔记

333 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

欢迎关注微信公众号《猿小龙》,为您分享更多编程知识,共同进步!

1.Android 网络通信

1.1 网络库开源框架对比

image.png

## 1.2 Retrofit介绍 - Retrofit是目前Android平台上,相对热门的网络请求封装框架,是对OKhttp的一种封装。

image.png

1.3 Retrofit快速使用

  1. Retrofit库的引入
  2. 创建用于描述网络请求的接口
  3. 使用Retrofit实例发起网络请求

1.4 Retrofit使用介绍

{
    "message":"success",
    "data":{
        "uid":1124,
        "first_name":"胡",
        "last_name":"哥"
    }
}

image.png

  1. 在需要使用Retrofit接口的moudle中新增依赖,最新版依赖:github.com/square/retr…

image.png

  1. 创建用于描述网络请求的接口

image.png

定义说明:

  • 接口类名:可自定义,尽量和这类请求的含义相关
  • 函数名:可自定义:需要识别出该接口的作用,该interface中可以添加多个不同的函数
  • @GET注解:用于指定该接口的相对路径,并采用GET方法发起请求
  • @PATH注解:需要外部调用时,传入一个UID,该UID会替换@GET注解中相对路径中的UID值
  • 返回值Call< ResponseBody>:这里用ResponseBody,我们可以直接拿到请求的String内容,如果要自动转换为Model类,例如User,这里直接替换为User就好
  1. 发起网络请求
  • 创建Retrofit实例
  • 创建请求接口的实例,并获取到Call实例
  • 调用Call.enqueue,进行异步请求
  • 处理返回的数据

image.png

1.5 注解类型

  • 在刚才的IUserInfoService中,有@GET和@PATH,使用了其中一部分注解类型,将多种注解进行组合将会产生丰富的功能

image.png

1.6 Cornet与OKhttp的区别

  • Cornet相比OKhttp做了不少优化,如请求成功率和网络延时方面
  • 但是Cornet使用C++编写,不方便直接使用,需要进行二次封装

image.png

1.7 网络库TTnet

  • 字节跳动大部分APP均在使用
  • 优点
  1. 基于Retrofit进行改造,具备其所有优点
  2. 支持多个Http网络库的动态切换(OKhttp和cornet)
  3. 支持网络拦截配置,添加公共参数,动态切换协议及Host,动态选路等
  4. 支持流解析,json序列化

1.8 Retrofit和TTnet简单用法对比

  • Retrofit

image.png

  • TTnet

image.png

1.9 TTnet是如何把Retrofit底层的OKhttp进行改造的呢?

  1. 先进行梳理Retrofit是如何封装和使用OKhttp进行发起网络请求的
  2. 既然TTnet是基于Retrofit进行修改的,那么可以在使用OKhttp的地方替换为Cornet来进行发送网络请求

1.10 注解介绍

  • 注解,可以理解为一个标签,这个标签可以加在类、方法、参数、成员变量上去,并且在合适的时机读取注解的内容进行处理
  • 例如:@Override:标注一个方法是重写了父类的实现;@Nullable:标注所描述对象可能为空

image.png

  • 例如:当我们定义描述请求接口的方法时:有想修饰方法名的@GET,和修饰参数的@PATH

image.png

  • 有定义和使用注解的地方,那么也就会有获取注解内容并处理注解内容的地方,一般有一下3个时机:
  1. SOURCE:只有在源码中有效,编译时被抛弃,如@Override
  2. CLASS:编译CLASS文件时有效,一般会使用注解处理器
  3. RUNTIME:运行期间,会获取相应的注解,并做相关处理

image.png

  • Retrofit注解:
  1. @GET定义
  2. @Target:指定作用的对象,这里是METHOD,说明这个注解作用在方法上,还包括其它枚举值。
  3. @Retention:指定注解的生命周期,这里是RUNTIME,说明这个注解要一直保留到运行时刻

image.png

Java
  • 注解的注释或获取:
  • 通过反射获取到Method对象后,通过一下接口获取注释内容
  1. Method.getGenericReturnType()获取返回类型
  2. Method.getAnnotations()获取方法的注解
  3. Method.getParameterAnnotations()获取参数注解

image.png

  • Retrofit是在运行期间,配合Java动态代理,获取方法和参数的注解,并构造Request对象,
  • Java动态代理,Proxy.neeProxyInstance
  1. 利用Java的反射技术(Java reflecttion)代理某个interface,一旦调用interface内的某个方法,实际通过代理去调用InvocationHandler的invoke方法
  2. 通过Method对象,就可以调用Methon.getAnnotations()和Method.getParameterAnnotations()来获取该方法和该方法的注解内容

image.png

image.png

image.png

1.11 Retrofit主要流程

  • 重点:OKhttp的创建和调用(绿色)
  • 主要流程
  1. 通过Builder模式,创建RetrofitConfig,保存BaseURI等内容
  2. 创建动态代理对象创建OKhttpCall
  3. 发送网络请求

image.png

1.12 Retrofit调用OKhttp

  • 在主流程图中,OKhttp的网络库的api,在Retrofit中是何时发起请求的,对应api已经列出,相同颜色及意味着调用关系
  1. 红色代码:标记4处,使用Retrofit的Call对象发起请求时,对应创建OKhttp网络库中Request对象和Call对象并且发起请求
  2. 绿色代码:标记1处,创建Retrofit对象,对应创建了OKhttpClient对象

image.png

1.13 Retrofit中OKhttpClient对象的创创建时机

  • Retrofit的BUilder构造行中,如果没有指定CallFactory,则会自动创建一个OKhttpClient
  • PS:有一个adapterFactories集合里面包含一个默认的CallAdapter.Factory,它是子类ExecutorCallAdapterFactory的实例

image.png

  • 创建好的OKhttpClient将会保存在Retrofit实例中
  • ExecutorCallAdapterFactory主要用来控制Retrofit在子线程中触发请求,在主线程中回调结果

image.png

1.14 OKhttpCall的创建

  • 当我们通过代理对象调用调用我们的接口方法时,IUserIfoService#getgerUserName()方法时,会触发InvocationHandler#invoke方法
  • 这里看到Retrofit写死了,仅支持OKhttp

image.png

1.15 TTNet类图设计

  • 核心:
  1. 替换底层用到的OKhttpClient
  2. 替换底层用到的OKhttpCall

image.png

1.16 TTnet主流程

image.png

## 1.17 网络通信总结

image.png