您的位置:首页 > 编程语言 > Java开发

Rrtrofit源码解读

2017-12-15 14:37 127 查看
一. 概述

1. 创建retrofit对象,采用Build模式配置baseUrl、addConver
4000
terFactory、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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 源码