RxJava+Retrofit+Okhttp 的源码解析

  RxJava+Retrofit+Okhttp前两年到现在一直都挺火的一个网络请求框架,Retrofit是对OkHttp的一个封装,RxJava的加入又实现了链式调用,使得后续的复杂处理,切换线程等操作变得很简单。虽然用着爽,但是有些问题还得自己解决。比如:Activity在Destroy或者点击返回键主动取消网络请求。https://www.jb51.net/article/159371.htm

我将这个框架分成四个部分(以异步的情况进行分析):

1.前期的准备:创建OkHttpClient    创建ApiService接口及其代理。

2.调用Api方法:通过代理去进行调用,主要是先通过反射的方法解析这个方法的请求头,请求类型,地址,路径,返回解析类型,方法的名字,入参个数以及入参类型等信息,保存到serviceMethod类中,并保存起来,这样下次直接缓存去取。然后通过这个serviceMethod+argu[]参数   生成OkhttpCall对象。最后调用adapt()方法生成异步请求的被观察者Observer。

3.自定义一个Observer,并注册到被观察者Observer中:此时,会执行网络请求。首先通过OkHttpCall 生成RequestBuilder,然后解析入参并添加到RequestBuilder里面去,最终生成Request。   然后通过工厂将Request+OkhttpClient生成一个RealCall对象,即是一个请求。      再然后通过RealCall.equeue(callback)进行触发网络任务(先将RealCall封装成AnsycCall,然后将任务扔到线程池中,里面有两个线程池,一个是等待队列线程池,一个是执行任务线程池,当任务池子未满时候会将任务添加进任务池子并立即执行,否则就添加进等待的池子)。最后通过执行execute()方法,此方法里面getResponseWithInterceptorChain()是网络请求的核心,他主要是通过链式调拦截器,先调用自定义的拦截器,然后再调用下面这几个retryAndFollowUpInterceptorBridgeInterceptor,CacheInterceptor,ConnectInterceptor,CallServerInterceptor

等。这里面有两个重要级别的ConnectInterceptor:创建一个Socket通道,然后读取信息流Source,然后立马关闭这个通道并把Source保存到HttpCodec里面,然后通过proced传递给CallServerInterceptor,然后再这个拦截器里面根据不同情况生成Response并返回,一层一层的往前返回。  最终网络请求返回了一个Response

4.Response的Gson解析,以及onNext()  onComplete()等回调处理。水到渠成,没啥讲的。

注意:在日常开发中,难免不了的需要手动取消请求。我个人总结了两种方法,或者思路:

1.注册的时候实现Obsver接口的onSubscribe(Disposable d)方法,拿到这个Disposable对象,就可以手动调用dispose()方法进行手动取消请求了。

2.CompositeDisposable,通过add(Disposable d)添加进去,通过。dispose()方法清除所有的请求。

这两个有利有弊,第一个复杂了点,但是可以按想法去取消一个或者多个不会出现问题。第二个简单粗暴,但是如果几个请求任务中有一个请求需要后台执行,这样就不好用了。所以大部分情况用第二个,个别用第一个单独处理即可。

总结:以上就是看了源码之后的大致流程,太细节的就没讲了,源码也不讲了,这里呢只是提供了主体的思路。我也是怕自己时间久了忘了,从头看又是半天,太浪费时间了。

猜你喜欢

转载自blog.csdn.net/lk2021991/article/details/89442471