
题图:来自飞哥的图片工厂
音乐推荐:后来
文丨IT大飞说
预计阅读时间:2.3 分钟
哈喽,朋友们,之前我们学习了一些 RxJava2.x 的常用操作符,今天我们来继续学习一下 RxJava 的 compose 操作符。
compose 操作符能够从数据流中得到原始的被观察者,当创建被观察者时,compose 操作符会立即执行,而不像其他的操作符需要在 onNext() 调用后才能执行。
使用场景一
我们可以用 compose 操作符来进行线程的切换,一般用在网络请求的地方。
原始的写法为:
1 2
| .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())
|
我们可以将上面的操作封装成一个简单的工具类来使用,我这里提供了 Java 版和 Kotlin 版本:
Java 版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| import io.reactivex.FlowableTransformer; import io.reactivex.MaybeTransformer; import io.reactivex.ObservableTransformer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers;
/** * Created by x-sir on 2019/4/19 :) * Function:线程调度 */ public class RxThreadUtils {
/** * Flowable 切换到主线程 */ public static <T> FlowableTransformer<T, T> flowableToMain() { return upstream -> upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); }
/** * Observable 切换到主线程 */ public static <T> ObservableTransformer<T, T> observableToMain() { return upstream -> upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); }
/** * Maybe 切换到主线程 */ public static <T> MaybeTransformer<T, T> maybeToMain() { return upstream -> upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } }
|
Kotlin 版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import io.reactivex.FlowableTransformer import io.reactivex.MaybeTransformer import io.reactivex.ObservableTransformer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import java.util.concurrent.TimeUnit
/** * Created by x-sir on 2019-06-02 :) * Function:RxJava2.x 线程切换工具类 */ object RxThreadUtils {
/** * Observable 切换到主线程 */ fun <T> observableToMain(): ObservableTransformer<T, T> { return ObservableTransformer { upstream -> upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) } }
/** * Flowable 切换到主线程 */ fun <T> flowableToMain(): FlowableTransformer<T, T> { return FlowableTransformer { upstream -> upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) } }
/** * Maybe 切换到主线程 */ fun <T> maybeToMain(): MaybeTransformer<T, T> { return MaybeTransformer { upstream -> upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) } } }
|
调用起来也比较简单,我们在网络请求的时候就可以这样调用(假设网络请求返回的是Flowable 对象):
1
| .compose(RxThreadUtils.flowableToMain())
|
使用场景二
compose 操作符可以和 Transformer 结合使用,一方面可以让代码看起来更加简洁,另一方面能够提高代码的复用性,因为 RxJava 提倡链式调用,我们可以合理的使用 compose 操作符来防止链式调用被打破。
RxLifecycle 是 trello 开源的一个配置 RxJava 使用的开源库,我们知道 RxJava 有个缺点就是会导致内存泄露,此时,RxLifecycle 横空出世了,它可以配合 RxJava 一起使用,可以有效防止内存泄漏发生,使用起来也是非常方便,举个简单的例子:
1 2 3
| myObservable .compose(RxLifecycle.bind(lifecycle)) .subscribe();
|
RxLifecycle 不在文本的讲解范围内,更多详细使用可看 GitHub 介绍:
https://github.com/trello/RxLifecycle
另外,知乎也开源了一个 RxLifecycle 库,使用起来也是比较方便的,感兴趣的可以看看:
https://github.com/zhihu/RxLifecycle
好了,今天的分享就到这里了。
飞哥带你去装逼,一直装逼到天黑!