我将这个框架分成四个部分(以异步的情况进行分析):
1.前期的准备:创建OkHttpClient 创建ApiService接口及其代理。
2.调用Api方法:通过代理去进行调用,主要是先通过反射的方法解析这个方法的请求头,请求类型,地址,路径,返回解析类型,方法的名字,入参个数以及入参类型等信息,保存到serviceMethod类中,并保存起来,这样下次直接缓存去取。然后通过这个serviceMethod+argu[]参数 生成OkhttpCall对象。最后调用adapt()方法生成异步请求的被观察者Observerable。
3.自定义一个Observer,并注册到被观察者Observerable中:此时,会执行网络请求。首先通过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()方法清除所有的请求。
这两个有利有弊,第一个复杂了点,但是可以按想法去取消一个或者多个不会出现问题。第二个简单粗暴,但是如果几个请求任务中有一个请求需要后台执行,这样就不好用了。所以大部分情况用第二个,个别用第一个单独处理即可。