Retrofit源码初探

2017-05-09  本文已影响23人  CHSmile

什么是Retrofit2

Retrofit2 可以说是目前最流行的类型安全网络库,是Square公司的一个开源项目,通过注解来创建restful API接口。目前2.0版本已经稳定,下文如无特殊说明,均指2.0版本。
Retrofit2使用步骤
Retrofit2的使用很简单,主要分为以下几个步骤:
创建Interface接口,通过注解标识客户端与后台约定的API接口

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

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

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

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

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

根据调用场景异步或同步,执行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方法进行的。

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执行。

RequestFactory生成Request方法

系统处理Response解析,查找匹配converter方法

总结

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

上一篇 下一篇

猜你喜欢

热点阅读