Rrtrofit源码解读

来源:互联网 发布:单片机模拟键盘输入 编辑:程序博客网 时间:2024/06/08 19:13

一. 概述
1. 创建retrofit对象,采用Build模式配置baseUrl、addConverterFactory、client(即okhttp实例),或者设置回调时的适配器。在retrofit中提供了三种CallAdapterFactory: GuavaCallAdapterFactory,Java8CallAdapterFactory和RxJavaCallAdapterFactory,也可以自定义数据解析器,使类继承Converter类。
2. 定义接口文件,使用Java的动态代理结束对接口文件创建实例。在动态代理的InvocationHandler中,有一个ServiceMethod类,这里用了缓存,缓存了之前调用过的网络请求的方法,loadServiceMethod(method)方法检测缓存里面有没有调用过这个method,要是有,就返回;要是没有,就生成一个request,然后加入缓存。
3. 生成一个OkHttpCall,这个类主要实现了Call接口,主要的作用就是发送一个HTTP请求,retrofit默认的也是这个类,我们也可以根据不同的情况实现自己的Call类。在OkHttpCall内部提供了异步和同步两种方法来发送请求,分别是同步的OkHttpCall.execute()和异步的OkHttpCall.enqueue()。
4. 在InvocationHandler中的最后一行代码中, return serviceMethod.callAdapter.adapt(okHttpCall);此时调用了RxJavaCallAdapterFactory.adapt()方法,返回我们想要的对象,比如android里面默认的Call<>。当设置的AdapterFactory为RxJavaCallAdapterFactory时,所以返回的是Observable<>。
当我们调用了rxjava的subscribe方法的时候(或者调用Call的enqueue方法) ,做了下面几件事:

  • 首先执行okHttpCall的execute()方法把网络请求交给okHttp,当完成请求后,会对网络请求的结果进行解析,在解析时,会调用serviceMethod.toResponse(catchingBody),这里会通过我们之前设置的GsonConverterFactory来解析返回的数据,然后再生成一个Response类。
  • 再回调到ExecutorCallAdapterFactory中,它的adapt()中生成了一个ExecutorCallbackCall对象,在这个ExecutorCallbackCall的enqueue(CallBack)中,会调用MainThreadExecutor的execute()方法,此时就是之前说的利用handler切换到主线程。
  • 最后因为我们使用了RxJava,所以在这里会对返回的call对象进行了进一步封装,生成了我们需要的Observable,而后可以进行流式操作。

二. Retrofit核心类详解
1. Retrofit
Retrofit关心的就是method和它的参数args,接下去来Retrofit就会用Java反射获取到方法的注解信息,配合args参数,生成ServiceMethod。

ServiceMethod serviceMethod = loadServiceMethod(method);

loadServiceMethod()中判断缓存中是否有当前方法,如无则创建一个ServiceMethod对象,并且将当前方法加入缓存。

```    result = new ServiceMethod.Builder(this, method).build();serviceMethodCache.put(method, result);```

2. ServiceMethod
ServiceMethod就像是一个中央处理器,传入Retrofit对象和Method对象,调用各个接口和解析器,通过RequestBuilder,最终生成一个Request,包含api的域名、path、http请求方法、请求头、是否有body、是否是multipart等等。
将实例化的serviceMethod传入OKHttpCall。

```OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);```

3. RequestBuilder
主要工作:拼接baseUrl和relativeUrl,添加RequestBody、Headers等,最终生成Request对象。
4. OKHttpCall
Retrofit2中Call接口的默认实现是OkHttpCall,它默认使用OkHttp3作为底层http请求client。使用异步的enqueue()和同步的execute()两种方法,利用okhttp发出请求,请求成功后,生成Response对象。
Retrofit中的动态代理返回值:

return serviceMethod.callAdapter.adapt(okHttpCall);

通过实例化retrofit时,通过Build模式添加CallAdapterFactory,adapt为接口CallAdapter 包含方法,接受Call对象后,将其返回值转化为特定类。此时serviceMethod.callAdapter()得到的是RxJavaCallAdapterFactory, 在adapt()中将Response转化为Observable。

Observable<Result<R>> observable = Observable.create(new CallOnSubscribe<>(call))     .map(new Func1<Response<R>, Result<R>>() {      @Override public Result<R> call(Response<R> response) {        return Result.response(response);      }    });return observable;
原创粉丝点击