前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RxJava2.x 操作符之 compose

RxJava2.x 操作符之 compose

作者头像
程序员飞飞
发布2020-03-02 14:30:26
2.5K0
发布2020-03-02 14:30:26
举报
文章被收录于专栏:Android&Java技术Android&Java技术

题图:来自飞哥的图片工厂

音乐推荐:后来 文丨IT大飞说 预计阅读时间:2.3 分钟

哈喽,朋友们,之前我们学习了一些 RxJava2.x 的常用操作符,今天我们来继续学习一下 RxJava 的 compose 操作符。

compose 操作符能够从数据流中得到原始的被观察者,当创建被观察者时,compose 操作符会立即执行,而不像其他的操作符需要在 onNext() 调用后才能执行。

使用场景一

我们可以用 compose 操作符来进行线程的切换,一般用在网络请求的地方。

原始的写法为:

代码语言:javascript
复制
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

我们可以将上面的操作封装成一个简单的工具类来使用,我这里提供了 Java 版和 Kotlin 版本:

Java 版本:

代码语言:javascript
复制
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 版本:

代码语言:javascript
复制
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 对象):

代码语言:javascript
复制
.compose(RxThreadUtils.flowableToMain())

使用场景二

compose 操作符可以和 Transformer 结合使用,一方面可以让代码看起来更加简洁,另一方面能够提高代码的复用性,因为 RxJava 提倡链式调用,我们可以合理的使用 compose 操作符来防止链式调用被打破。

RxLifecycle 是 trello 开源的一个配置 RxJava 使用的开源库,我们知道 RxJava 有个缺点就是会导致内存泄露,此时,RxLifecycle 横空出世了,它可以配合 RxJava 一起使用,可以有效防止内存泄漏发生,使用起来也是非常方便,举个简单的例子:

代码语言:javascript
复制
myObservable
    .compose(RxLifecycle.bind(lifecycle))
    .subscribe();

RxLifecycle 不在文本的讲解范围内,更多详细使用可看 GitHub 介绍:

https://github.com/trello/RxLifecycle

另外,知乎也开源了一个 RxLifecycle 库,使用起来也是比较方便的,感兴趣的可以看看:

https://github.com/zhihu/RxLifecycle

好了,今天的分享就到这里了。

飞哥带你去装逼,一直装逼到天黑!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用场景一
  • 使用场景二
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档