Retrofit
已经流行好久了,他是square公司开源的一个优秀的网络框架,这个内部对OkHttp
进行了封装,使得利用okhttp进行网络访问变得更加简单。
简单使用
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.callTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.build();
mRetrofit = new Retrofit.Builder()
.baseUrl("http://www.baidu.com/")
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.callbackExecutor(new SerializeExecutor(new ThreadExecutor()))
.build();
public <Service> Service create(Class<Service> serviceClass) {
Service service = (Service) serviceMap.get(serviceClass);
if (service != null) {
return service;
}
synchronized (serviceMap) {
service = (Service) serviceMap.get(serviceClass);
if (service == null) {
service = mRetrofit.create(serviceClass);
serviceMap.put(serviceClass, service);
}
}
return service;
}
接下来我们就需要详细去解析Retrofit请求网络的流程了。
1、Retrofit的创建
retrofit拥有6个重要的成员变量,下面我们就先来讲讲这五个成员变量:
- callFactory 这个变量其实就是
OkHttpClient
的对象,主要用来创建okhttp的RealCall来发起请求; - baseUrl 基础url,用来拼接访问连接,在真实的网络请求中如果我们设置了完整的访问路径,这个url就不起作用了;
- callAdapterFactories
CallAdapter
的工厂集合,CallAdapter
的功能是将我们okhttp的call转换成我们定义的方法的返回类型,比如Rxjava的Observable。在请求的时候,会遍历整个集合,根据方法的返回值和注解找到合适的CallAdapter
; - converterFactories
Converter
的工厂集合。Converter
是将okhttp的请求结果的ResponseBody转换为我们自己想要的java类型。在结果返回后,会遍历整个集合找到合适的Converter
来做类型转换; - callbackExecutor 这个关系到我们请求回调发生在哪里,默认不设置的时候使用的是主线程,使用Handler进行线程切换;
- serviceMethodCache 记录加载的方法,复用以免二次加载;
这些我们可以根据自己的使用按需设置。
2、调用create方法
retrofit内部使用的是动态代理技术,这也很好理解,因为retrofit知道使用的时候才知道需要加载的方法属于哪个类。排除掉一些干扰方法后,就开始执行loadServiceMethod(method).invoke(args != null ? args : emptyArgs)
3. HttpServiceMethod
loadServiceMethod(method)
目的是生成一个HttpServiceMethod
对象,使用这个对象来进行方法的调用。我们这里就需要好好讲讲这个HttpServiceMethod
了,它的对象的创建需要传入requestFactory、callFactory、callAdapter、responseConverter。callFactory、callAdapter、responseConverter,这些上面就讲过了,这里就不再赘述了。requestFactory顾名思义请求工厂,我们都知道,okhttp发起请求的时候需要传入Request
,requestFactory会根据我们在自定义的方法的注解以及参数注解和参数帮我们生成Request
。
创建好HttpServiceMethod
对象后,就调用invoke方法,实际里面执行的是callAdapter的adapt方法
4. 执行callAdapter的adapt(OkHttpCall)方法
callAdapter的adapt(OkHttpCall)就是okhttp的call转换成我们定义的方法的返回类型,比如Rxjava的Observable,最后去发起请求;请求的执行最后会交给OkHttpCall
的enqueue和execute;这里我们只分析enqueue方法;
5. OkHttpCall的enqueue
- 生成okhttp请求的RealCall;
- 执行RealCall的enqueue方法
- 请求成功后使用Converter将ResponseBody转换成我们需要的java类,并回调
T body = responseConverter.convert(catchingBody);
return Response.success(body, rawResponse);
到这里Retrofit的流程大致就讲完了。谢谢观赏!
网友评论