-
Notifications
You must be signed in to change notification settings - Fork 2.6k
OkRx
OkRx是针对RxJava,将OkGO扩展的项目,使用的RxJava的版本如下:
compile 'io.reactivex:rxjava:1.3.0'
OkRx2是针对RxJava2,将OkGO扩展的项目,使用的RxJava2的版本如下:
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
OkRx与OkRx2具有相同的使用方法,相同的Api调用方式,所以该文档以OkRx2为例,给出相关用法,OkRx的文档请参考该文档。
- 可以很完美结合RxJava做网络请求
- 在使用上比Retrofit更简单方便,门槛更低,灵活性更高
- 网络请求和RxJava调用可以做成一条链试,写法优雅
- 使用Converter接口,支持任意类型的数据自动解析
- OkRx是扩展的OkGo,所以OkGo包含的所有功能和写法,OkRx全部支持
我们还是像正常使用OkGo的方式一样,传入我们需要请求的url,和我们需要的参数,写法如下:
这里有两个特殊的方法:
- .converter():该方法是网络请求的转换器,功能是将网络请求的结果转换成我们需要的数据类型。
-
.adapt():该方法是方法返回值的适配器,功能是将网络请求的
Call<T>
对象,适配成我们需要的Observable<T>
对象。
现在我们已经获取了Observable
对象了,熟悉RxJava
的你难道还不会使用了吗,直接上代码:
上面的调用很简单,我们可以把这两步放在一起写,如下:
有人可能觉得链试代码太长,没关系,我们完全可以像Retrofit
一样,自己写一个ServerApi
类,这里面管理了所有的接口请求和参数,只是OkGo并不是采用的注解和反射实现的,而是通过传参来实现,相信对你你来讲,这样的方式更加直观。
我们知道Converter接口的作用就是将服务端的数据做解析转换的,仿佛这句话很熟悉,在哪看见过。如果你用过OkGo的基本请求,那么你一定知道我们会自定义Callback,实现里面的convertResponse方法,而Callback结构就是继承至Converter接口,所以他两本质就是一个东西。
那么其实Converter的写法,和自定义Callback的写法原理是一样的,详细参考
我们也内置了
-
StringConverter:按文本解析,解析的编码依据服务端响应头中的
Content-Type
中的编码格式,自动进行编码转换,确保不出现乱码。 - BitmapConverter:如果请求的数据是图片,则可以使用该转换器,该方法对图片进行了压缩处理,确保不发生OOM。
- FileConverter:如果要做文件下载,可以使用该转换器,内部封装了关于文件下载和进度回调的方法。
- 如果这些不能满足你的需求,参考上面的自定义Converter链接。
我们写Rx请求的时候,最后调用了一个adapt()
方法,这里面需要一个CallAdapter
适配器接口,那么这个适配器是什么东西呢,主要功能就是将我们得到的Call<T>
对象,适配成我们需要的Observable<T>
对象。
参考okrx2源码的目录结构如下: 在adapter包下,命名规则分为这么几组:
开头的意思:
- Observable开头,表示返回的对象是Observable对象
- Flowable开头,表示返回的对象是Flowable对象
- Maybe开头,表示返回的对象是Maybe对象
- Single开头,表示返回的对象是Single对象
- Completable开头,表示返回的对象是Completable对象
结尾的意思:
- Response结尾,表示返回对象的泛型是Response<T>
- Body结尾,表示返回对象的泛型是T,没有外层的Response包装
- Result结尾,表示返回对象的泛型是Result<T>
其实关于adapt()
方法还有个重载方法,可以额外传递一个AdapterParam
参数,如下:
目前,AdapterParam
对象只有一个参数,如下:
我们都知道,okhttp有两种请求方式,一种是同步请求,一种是异步请求,那么这个参数就是控制,我把当前的Call<T>对象适配成Observable<T>时,是使用同步还是异步的方法。如果是使用同步的方法,对应的,我们就使用的是okrx2源码中的CallExecuteObservable
对象来适配,如果是异步,那么就使用CallEnqueueObservable
对象来适配。他们有什么区别的,其实只有一个最大的区别,就是缓存的使用。
默认情况下,我们使用的是异步请求来适配的,使用方式和okgo使用缓存一样,指定cacheKey
和cacheMode
就行了,如下:
那么对于okrx
缓存回调成功和网络请求回调成功都是回调onNext()
方法,那么怎么区分呢,回调的Response
对象中有个isFromCache
方法,就是表示当前回调是来自缓存还是网络。
注意事项:
- 不同的缓存模式会导致onNext()方法具有不同的回调次数,可能一次或者两次
- 如果使用同步方法来适配的话,缓存模式
CacheMode.FIRST_CACHE_THEN_REQUEST
是不生效的,异步才生效,原因是同步请求没法返回两次数据。
我们可以在基类创建这么两个方法,把每一个请求的Disposable
对象都交给由统一的CompositeDisposable
对象去管理。
在Observer
对象的onSubscibe
方法中,把Disposable
添加到CompositeDisposable
中
然后我们在界面销毁或者需要取消的地方调用取消请求的方法。