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;
- Rrtrofit源码解读
- 购物车 Rrtrofit&RXjava
- 源码解读
- 源码解读之Intent解读
- [源码解读] FastClick.js源码解读
- CppUnit源码解读(1)
- CppUnit源码解读(2)
- CppUnit源码解读(3)
- CppUnit源码解读(4)
- CppUnit源码解读(5)
- CppUnit源码解读(6)
- shared_ptr源码解读
- strutsr源码解读
- shared_ptr源码解读
- CppUnit源码解读
- CppUnit源码解读
- Ajax::prototype 源码解读
- CppUnit源码解读
- 【2017】法定各种假期的规则及概念
- Greenplum merge insert 用法与性能 (insert on conflict)
- 几个记录
- 网络安全行业结合了国际智慧和技能
- Docker(ubuntu安装)
- Rrtrofit源码解读
- 课程设计 最小时间 最短路径 模板 .
- 选择排序和插入排序
- Spring中使用纯JDBC连接数据库的配置
- java web如果把一些配置数据保存到本地。
- TP5验证规则
- 2015.3买的书籍
- 排序算法的时间复杂度和空间复杂度表
- Arrays.sort()