概述
在开发中使用RxJava+Retrofit的网络框架,是时下的趋势,使用起来也非常的方便.
如果能够在一定程度上进一步封装,能够大大提高我们的开发效率.接下来我们看一下比较常用的简洁处理场景.
CreateObservable
我们都知道创建一个Observable可以使用RxJava的创建操作符,比如Create,..等等,
在effective-rxjava中作者介绍了一种将functions转化为observable的方式,感觉非常新颖,果断使用了.
通过 defer 和 just 操作符方便的将Func0转化为 Observable
1 | /** |
我们都知道defer还有一个好处就是只有订阅时才会生效,而just中的参数采用了泛型化,
即我们可以将任意一个有返回值的方法都使用 defer,产生即时的数据流.
1 | private Object slowBlockingMethod() { ... } |
使用方式
1 | public Observable<Optional<ContentItem>> fetchContentItem( |
Transformer
在Don’t break the chain: use RxJava’s compose() operator中作者建议使用compose来避免打破RxJava的链式调用,compose中需要传入一个Transformer,我们先来看一下Transformer的源码.
1 | /** |
从中我们可以看到Transformer是一个Func1,其将一种类型的Observable转换成另一种类型的Observable
常见的Transformer用法
- 线程切换
在RxJava中最常用的某过于 线程切换 了,我们定义一个线程切换的RxSchedulerTransformer
1 | public class RxSchedulerTransformer<T> implements Observable.Transformer<T, T> { |
- 错误处理
一般和服务器交互取回的json数据结构类似下面这种,当success == true的时候才是正确的返回值,success == false 的时候,虽然不会走 RxJava的OnError,但是也是异常.我们希望的是 所有的 异常都在OnError中处理.OnNext只关心正确的返回值即可.
1 | { |
根据如上json,我们的Transformers可定义为如下格式,对结果进行一些预处理,只有正常值才返回JavaBean
1 | public class RxHandleResultTransformer<T> |
自定义操作符
和compose不同的是,自定义Operator 作用于Observable发射的单独的数据项,compose作用于整个流, 自定义操作符是和lift一起使用的,自定义操作符需要实现Operator
更多关于自定义操作符的介绍;
实现自己的操作符
RxJava操作符(十)自定义操作符
三级缓存
其实Retrofit是可以处理缓存的,相关介绍:Retrofit2.0使用总结及注意事项,
这里需要注意的是Retrofit缓存需要使用@GET才生效,而且是使用的文件存储.
关于RxJava缓存参考:RxJava使用场景小结,用RxJava的方式来处理缓存问题
1 | Observable<String> memory = Observable.create(new Observable.OnSubscribe<String>() { |
这里用到了concat与onErrorReturn两个操作符,关于concat(连接操作符),官方解释
关于onErrorReturn(错误处理操作符),可以看这里:RxJava错误处理
屏幕切换
存在如下两种问题:
我们知道 屏幕切换等配置发生改变的时候,会导致
Activity的重建,当我们订阅了某一个Subscribtion后,屏幕发生了改变,
及调用了unsubscribe方法,如何才能保证Subscribtion的延续呢?在
Android中Context是导致很多 内存泄漏的罪魁祸首.如果我们创建的subscribtion持有了Context将会变得十分的危险,
如果Observable没有准时完成,就很容易导致内存泄漏.
第一种问题,可以用RxJava的缓存机制解决,就是cache(或是replay()),
1 | Observable<Photo> request = service.getUserPhoto(id).cache(); |
第二个问题的解决方案就是在生命周期的某个时刻取消订阅。采用CompositeSubscription来管理
1 | CompositeSubscription mCompositeSubscription; |
RxAndroid 中好用的方法
RxAndroid为我们提供了很多好用的API,如HandlerThreadScheduler,AndroidObservable,ViewObservable
其中HandlerThreadScheduler是一个可以绑定到Handler上的scheduler,AndroidObservable可以绑定到 Activity 或 Fragment,方便生命周期的管理.同时可以方便的创建一个BroadCastReceiver的Observable,ViewObservable用于给View添加绑定,如 ViewObservable.clicks()(监听View的点击事件)或者 ViewObservable.text()(监听TextView的内容变化)
1 | AndroidObservable.bindActivity(this, retrofitService.getImage(url)) |
参考:RxJava使用场景小结
RxJava + Retrofit 的实际应用场景
Don’t break the chain: use RxJava’s compose() operator
effective-rxjava
实现自己的操作符
RxJava操作符(十)自定义操作符