Retrofit2源码解析

Posted ChuckChenLw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit2源码解析相关的知识,希望对你有一定的参考价值。

  最近项目将网络框架换成Retrofit2.0.2,文中说的Retrofit都是指的Retrofit2这里要说明一下,毕竟和Retrofit1差别还是蛮大的,结合Okhttp,RxJava还是比较好用的,网上有很多前辈介绍过使用方法,本文是想研究一下Retrofit的源码。关于Retrofit的介绍可以查阅Retrofit的官方网站
  直接进入主题:(注本文是结合RxJava介绍的,最好可以了解一下RxJava不了解也没有关系,大部分的思想是一样的)
  Retrofit的基本使用
  Retrofit使用是非常简单的,在上边的官网上介绍的也非常详细。但是为了后边的分析,还是把使用的代码贴在这儿:
  一般在项目中会将需要请求网络方法写在一个接口中,如下:

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

  如果要使用Retrofit还需要构建Retrofit的对象:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

  主要就是配置baseUrl,ConverterFactory,CallAdapterFactory。这里用的是Gson,和RxJava所以相应的就是GsonConverterFactoryRxJavaCallAdaperFactory这个在后边的源码分析中会用到。
  最后直接调用就可以了:
  

GitHubService service = retrofit.create(GitHubService.class);

service.listRepos("octocat")
              .observeOn(androidSchedulers.mainThread())
              .subscribeOn(Schedulers.io())
              .subscribe(list->{
              if(list!=null){
              //TODO 取得数据后逻辑处理
              }
             });

  可以说,代码还是非常简洁的。用起来也很容易上手。
  Retrofit工作流程
  如上面的使用中我们可以看到:
1.通过Retrofit.Builder().build()构建Retrofit实例。
2.调用Retrofit的create()方法将生成接口GitHubService的实例。
3.调用GitHubService的listRepos()方法返回Observable<List<Repo>>,这里的GitHubService实例实际上是个代理对象,这个下文再说。
  下图是我整理的Retrofit运行时主要节点的时序图,当然不是所有的过程都反映出来了。
  这里写图片描述
  看不懂没关系,一步一步来,先看看Retrofit源码的构成: