Skip to content
廖子尧 edited this page Jun 12, 2017 · 5 revisions

注意事项

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的文档请参考该文档。

OkRx主要功能

  • 可以很完美结合RxJava做网络请求
  • 在使用上比Retrofit更简单方便,门槛更低,灵活性更高
  • 网络请求和RxJava调用可以做成一条链试,写法优雅
  • 使用Converter接口,支持任意类型的数据自动解析
  • OkRx是扩展的OkGo,所以OkGo包含的所有功能和写法,OkRx全部支持

请求写法

1. 获取Observable对象

我们还是像正常使用OkGo的方式一样,传入我们需要请求的url,和我们需要的参数,写法如下:

这里有两个特殊的方法:

  • .converter():该方法是网络请求的转换器,功能是将网络请求的结果转换成我们需要的数据类型。
  • .adapt():该方法是方法返回值的适配器,功能是将网络请求的Call<T>对象,适配成我们需要的Observable<T>对象。

2. 调用Rx转换代码

现在我们已经获取了Observable对象了,熟悉RxJava的你难道还不会使用了吗,直接上代码:

3. 代码整合

上面的调用很简单,我们可以把这两步放在一起写,如下:

4. 结构优化

有人可能觉得链试代码太长,没关系,我们完全可以像Retrofit一样,自己写一个ServerApi类,这里面管理了所有的接口请求和参数,只是OkGo并不是采用的注解和反射实现的,而是通过传参来实现,相信对你你来讲,这样的方式更加直观。

Converter详解

我们知道Converter接口的作用就是将服务端的数据做解析转换的,仿佛这句话很熟悉,在哪看见过。如果你用过OkGo的基本请求,那么你一定知道我们会自定义Callback,实现里面的convertResponse方法,而Callback结构就是继承至Converter接口,所以他两本质就是一个东西。

那么其实Converter的写法,和自定义Callback的写法原理是一样的,详细参考

我们也内置了

  • StringConverter:按文本解析,解析的编码依据服务端响应头中的Content-Type中的编码格式,自动进行编码转换,确保不出现乱码。
  • BitmapConverter:如果请求的数据是图片,则可以使用该转换器,该方法对图片进行了压缩处理,确保不发生OOM。
  • FileConverter:如果要做文件下载,可以使用该转换器,内部封装了关于文件下载和进度回调的方法。
  • 如果这些不能满足你的需求,参考上面的自定义Converter链接。

CallAdapter详解

我们写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>

OkRx使用缓存

其实关于adapt()方法还有个重载方法,可以额外传递一个AdapterParam参数,如下: 目前,AdapterParam对象只有一个参数,如下: 我们都知道,okhttp有两种请求方式,一种是同步请求,一种是异步请求,那么这个参数就是控制,我把当前的Call<T>对象适配成Observable<T>时,是使用同步还是异步的方法。如果是使用同步的方法,对应的,我们就使用的是okrx2源码中的CallExecuteObservable对象来适配,如果是异步,那么就使用CallEnqueueObservable对象来适配。他们有什么区别的,其实只有一个最大的区别,就是缓存的使用。

默认情况下,我们使用的是异步请求来适配的,使用方式和okgo使用缓存一样,指定cacheKeycacheMode就行了,如下:

那么对于okrx缓存回调成功和网络请求回调成功都是回调onNext()方法,那么怎么区分呢,回调的Response对象中有个isFromCache方法,就是表示当前回调是来自缓存还是网络。

注意事项:

  • 不同的缓存模式会导致onNext()方法具有不同的回调次数,可能一次或者两次
  • 如果使用同步方法来适配的话,缓存模式CacheMode.FIRST_CACHE_THEN_REQUEST是不生效的,异步才生效,原因是同步请求没法返回两次数据。

取消请求

我们可以在基类创建这么两个方法,把每一个请求的Disposable对象都交给由统一的CompositeDisposable对象去管理。

Observer对象的onSubscibe方法中,把Disposable添加到CompositeDisposable

然后我们在界面销毁或者需要取消的地方调用取消请求的方法。