IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 由浅入深剖析Retrofit原理收好了!!! -> 正文阅读

[网络协议]由浅入深剖析Retrofit原理收好了!!!

深剖Retrofit 2.0 源码(一)

1.简介:

在这里插入图片描述注意:

  • 准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。
  • 原因:网络请求的工作本质上是 OkHttp 完成,而Retrofit 仅负责 网络请求接口的封装。在这里插入图片描述
    可看出:
  • App应用程序通过 Retrofit 请求网络,实际上是使用Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
  • 在服务端返回数据之后,OkHttp 将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析。

2.与其他网络请求开源库对比

除了Retrofit和Okhttp,如今Android中主流的网络请求框架还有:

  • Android-Async-Http:作者Loopj,基于HttpClient,作者已经停止对该项目维护,Android5.0后不推荐使用HttpClient,所以不推荐使用,Github地址:Android-Async-Http
  • Volley:作者Google,基于HttpUrlConnection,封装了图片框架,支持图片加载,简单易用,都是把数据放在byte数组里,所以只适合轻量级网络交互,不适合用来上传文件。Github地址:Volley

3.Retrofit 的具体使用

使用 Retrofit 的步骤共有7个:

步骤1:添加Retrofit库的依赖
步骤2:创建 接收服务器返回数据 的类
步骤3:创建 用于描述网络请求 的接口
步骤4:创建 Retrofit 实例
步骤5:创建 网络请求接口实例 并 配置网络请求参数
步骤6:发送网络请求(异步 / 同步
详细过程可参考:这是一份详细的 Retrofit使用教程(含实例讲解)

4.源码详解

4.1网络通信过程对比

一般网络请求:开始=》配置网络请求参数=》创建请求对象=》发送网络请求=》解析数据=》处理数据
=》结束

Retrofit请求网络通信过程 :开始=》配置网络请求参数(通过注解)=》创建请求对象=》适配到具体的Call=》发送网络请求=》解析数据=》切换线程(子线程-主线程)=》处理返回数据=》结束
具体过程:

  1. 通过解析 网络请求接口的注解 配置 网络请求参数
  2. 通过 动态代理 生成 网络请求对象
  3. 通过 网络请求适配器 将 网络请求对象 进行平台适配(平台包括:Android、Rxjava、Guava和java8)
  4. 通过 网络请求执行器 发送网络请求
  5. 通过 数据转换器 解析服务器返回的数据
  6. 通过 回调执行器 切换线程(子线程 ->>主线程)
  7. 用户在主线程处理返回结果
4.2源码分析

1.创建Retrofit实例

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://baidu.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();

2.源码分析:
Retrofit实例是使用建造者模式通过Builder类进行创建的建造者模式:将一个复杂对象的构建与表示分离,使得用户在不知道对象的创建细节情况下就可以直接创建复杂的对象。

3.将实例分成“new Retrofit”、“Builder()”、“baseUrl(“http://fanyi.youdao.com/”)”、“addConverterFactory(GsonConverterFactory.create())”、“.build()五部分逐一分析

步骤一:“new Retrofit”

<-- Retrofit-->
public final class Retrofit {
private final Map<Method, ServiceMethod> serviceMethodCache = new LinkedHashMap<>();
// 网络请求配置对象(对网络请求接口中方法注解进行解析后得到的对象)
// 作用:存储网络请求相关的配置,如网络请求的方法、数据转换器、网络请求适配器、网络请求工厂、基地址等
private final HttpUrl baseUrl;
// 网络请求的url地址
private final okhttp3.Call.Factory callFactory;
// 网络请求器的工厂
// 作用:生产网络请求器(Call)
// Retrofit是默认使用okhttp
private final List<CallAdapter.Factory> adapterFactories;
// 网络请求适配器工厂的集合
// 作用:放置网络请求适配器工厂
// 网络请求适配器工厂作用:生产网络请求适配器(CallAdapter)
// 下面会详细说明
private final List<Converter.Factory> converterFactories;
// 数据转换器工厂的集合
// 作用:放置数据转换器工厂
// 数据转换器工厂作用:生产数据转换器(converter)
private final Executor callbackExecutor;
// 回调方法执行器
private final boolean validateEagerly;
// 标志位
// 作用:是否提前对业务接口中的注解进行验证转换的标志位

<-- Retrofit类的构造函数 -->
Retrofit(okhttp3.Call.Factory callFactory,HttpUrl baseUrl,
List<Converter.Factory> converterFactories, List<CallAdapter.Factory> adapterFactories,
Executor callbackExecutor, boolean validateEagerly) {
this.callFactory = callFactory;
this.baseUrl = baseUrl;
this.converterFactories =unmodifiableList(converterFactories);
this.adapterFactories =unmodifiableList(adapterFactories);
// unmodifiableList(list)近似于UnmodifiableList<E>(list)
// 作用:创建的新对象能够对list数据进行访问,但不可通过该对象对list集合中的元素进行修改
this.callbackExecutor = callbackExecutor;
this.validateEagerly = validateEagerly;
// 仅贴出关键代码
}

成功建立一个Retrofit对象的标准:配置好Retrofit类里的成员变量,即配置好:

  • serviceMethod:包含所有网络请求信息的对象
  • baseUrl:网络请求的url地址
  • callFactory:网络请求工厂
  • adapterFactories:网络请求适配器工厂的集合
  • converterFactories:数据转换器工厂的集合
  • callbackExecutor:回调方法执行器

所谓xxxFactory、“xxx工厂”其实是设计模式中工厂模式的体现:将“类实例化的操作”与“使用对象的操作”分开,使得使用者不用知道具体参数就可以实例化出所需要的“产品”类。

这里详细介绍一下:CallAdapterFactory:该Factory生产的是CallAdapter,那么CallAdapter又是什么呢?CallAdapter详细介绍:

  • 定义:网络请求执行器(Call)的适配器
    1. Call在Retrofit里默认是OkHttpCall
    2. 在Retrofit中提供了四种CallAdapterFactory:ExecutorCallAdapterFactory(默认)GuavaCallAdapterFactory、Java8CallAdapterFactory、
  • 作用:将默认的网络请求执行器(OkHttpCall)转换成适合被不同平台来调用的网络请求执行器形式。 如:一开始Retrofit只打算利用OkHttpCall通过ExecutorCallbackCall切换线程;但后来发现使用Rxjava更加方便(不需要Handler来切换线程)。想要实现Rxjava的情况,那就得使用RxJavaCallAdapterFactoryCallAdapter将OkHttpCall转换成Rxjava(Scheduler):
  • 好处:用最小代价兼容更多平台,即能适配更多的使用场景

所以,接下来需要分析的步骤2、步骤3、步骤4、步骤4的目的是配置好上述所有成员变量

由于篇幅原因,有关Retrofit的其他内容,就暂时放到下篇文章!

参考:
这是一份详细的 Retrofit使用教程(含实例讲解)
《Android 百大框架源码解析》

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-27 13:09:19  更:2021-10-27 13:09:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:45:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码