美文网首页
Retrofit2 源代码初步解读

Retrofit2 源代码初步解读

作者: nziyouren | 来源:发表于2016-02-16 00:00 被阅读0次

前段时间把公司的网络库替换成Square的Retrofit2,大幅提高工作效率。工作之余,抽点时间,喝杯茶简单研读了下Retrofit2的源代码,堪称设计模式的典范。

本文从什么是Retrofit2、Retrofit2如何使用、Retrofit2内部原理3个步骤来解读Retrofit2。

什么是Retrofit2

Retrofit2 可以说是目前最流行的类型安全网络库,是Square公司的一个开源项目,通过注解来创建restful API接口。目前2.0版本已经稳定,下文如无特殊说明,均指2.0版本。

Retrofit2使用步骤

Retrofit2的使用很简单,主要分为以下几个步骤:

  1. 创建Interface接口,通过注解标识客户端与后台约定的API接口

public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}

  1. 创建Retrofit实例,生成Interface的实现类(动态代理实现对象)

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.build();
GitHubService service = retrofit.create(GitHubService.class);

  1. 调用上面创建的实现类中的API请求方法,取得Call对象

Call<List<Repo>> repos = service.listRepos("octocat");

  1. 根据调用场景异步或同步,执行call对象的同步或异步执行方法,异步方法需要传入Callback回调参数
  • 异步:call.enqueue(Callback callback)
  • 同步:call.execute()

Retrofit2内部原理

根据上面Retrofit2使用步骤,我们逐步来探究Retrofit内部的奥秘

  • 第一步没啥好说的,就是根据跟服务器的接口协议文档写注解接口。
  • 根据接口创建相关执行代理对象。从源代码可以看到此处使用了JAVA中的动态代理技术,类似于方法hook,调用接口中的任何方法都会事先调用proxy中的钩子方法。


    动态代理

    这里的钩子方法为

loadMethodHandler(method).invoke(args)

我们一步步跟下去,接着看loadMethodHandler方法

loadMethodHandler方法
loadMethodHandler方法就是根据method返回相应的methodHandler。MethodHandler顾名思义为方法处理器,method与MethodHandler一一对应的关系是采用map实现的。一个method对应一个MethodHandler,如果当前method对应handler不存在则会创建一个然后再put到map里面。
通过method获取对应的handler后,调用handler的invoke()方法。
handler的invoke方法
我们再往里面分析,可以看到invoke方法使用CallAdapter进行Call<R>的转换。Call转换工作是通过CallAdapter call适配器的adapt方法进行的。
  • CallAdapter是什么?顾名思义就是Call的适配器,作用就是创建/转换Call对象,把Call转换成预期的格式。CallAdatper创建是通过CallAdapter.factory工厂类进行的,本身只有一个转换方法adapt()。创建CallAdatper Factory需要实现Factory接口,接口只包含一个方法CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit); 通过传入的returnType参数来返回相应的CallAdapter。

interface Factory {
CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit);
}

DefaultCallAdapter为Retrofit2自带默认Call转换器,用来生成OKHTTP的call请求调用。
Retrofit内部维护着一个calladapterFactory列表。Retrofit会依次遍历adapterFactory list列表来查询并返回能够处理对应returntype的calladapter,如果一个都获取不到,则抛出illegalArgument异常。Retrofit内置2种callAdapter,都只能处理返回类型为Call的调用。两者唯一区别是Call的回调是否通过指定的Executor执行。

  • 异步/同步发起请求。请求最终生成的还是okhttp raw call,然后再分别进行异步/同步调用。okhttp raw call的生成是通过RequestFactory来完成的。
RequestFactory生成Request方法
  • 返回请求的解析。服务器返回的数据格式一般为JSON/XML,采用相应的解析器ResponseConverter转换成Class对象。ResonseConverter实现Converter接口,Converter接口只有一个T convert(F value)方法和Factory工厂内部类。用户自定义Converter需实现Converter接口。Retrofit内部维护着一个ResonseConvert列表,代表retrofit解析结果的能力。Retrofit解析的时候依次从列表中取出converter尝试做转换,转换成功则返回转换Class对象,如果转换失败,继续选取列表中下一个Converter直到最后失败抛出IllegalArgumentException(Could not locate ResponseBody converter for **)异常。
系统处理Response解析,查找匹配converter方法

总结

Retrofit源代码初步解读就到此结束,在分析的过程中深刻感觉顶尖高手写的代码是多么的巧妙,需向大牛们多多学习。
Retrofit2库主要涉及到的知识点:泛型,注解。运用的设计模式:工厂模式,适配器模式,单例模式,代理模式。通过适配器模式实现了Retrofit的插件化。

相关文章

  • Retrofit2 源代码初步解读

    前段时间把公司的网络库替换成Square的Retrofit2,大幅提高工作效率。工作之余,抽点时间,喝杯茶简单研读...

  • Retrofit2源码解析——网络调用流程(下)

    Retrofit2源码解析系列 Retrofit2源码解析(一) Retrofit2源码解析——网络调用流程(上)...

  • inav源代码解读

    build 版本号,断言,调试,编译等相关配置 cms OSD、灯带等内容管理 config 配置管理 fc...

  • IOS #define和预编译指令

    预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 ...

  • retrofit2.0源码分析

    Android 手把手教你使用Retrofit2 Retrofit2源码分析 总结 这里总结下Retrofit2的...

  • Retrofit2源码解析——网络调用流程(上)

    Retrofit2源码解析系列 Retrofit2源码解析(一) 本文基于Retrofit2的2.4.0版本 网络...

  • Retrofit2 使用方法

    Retrofit2 网络客户端框架 资料 Github官网 你真的会用Retrofit2吗?Retrofit2完全...

  • Java Retrofit2使用--自定义转换器

    Java Retrofit2使用--自定义转换器 Retrofit2的基础使用请参考Java Retrofit2使...

  • 初步的解读—符号

    语言符号及其本质 符号是人类思维的最核心的载体。 语言是最常见最典型的一种符号系统。 符号的本质是知觉,可以是声音...

  • 初步的解读—自我

    自我的复杂性 自我是一个认知,由自我这个符号关联诸多的知觉。 这些知觉都和神经网络所在的人体有关。 有些人的自我认...

网友评论

      本文标题:Retrofit2 源代码初步解读

      本文链接:https://www.haomeiwen.com/subject/vaeykttx.html