android - 何时在 rxjava 中使用 `unSubscribeOn`

标签 android rx-java rx-java2 rx-android

我使用 RxJava 一段时间了。我使用 subscribeOnobserveOn 运算符来管理线程。我使用 subscribeOniocomputation 线程中启动可观察发射,并使用 observeOn(AndroidSchedluers .mainThread())

在我的应用程序中,流通常如下所示

compositeDisposable.add(observable()
            .flatMap(result-> { // do something })
            .map(result -> // doSomething)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()))
            .subscribeWith(new DisposableObserver<Object>() {
                            @Override
                            public void onNext(Object o) {

                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onComplete() {

                            }
                        }));

如您所见,我将观察者添加到 CompositeDisposable 中,这样,如果我的 Activity 或 fragment 在可观察对象在后台线程中执行某些操作期间超出范围,我可以安全地将观察者与链断开以避免任何内存泄漏。非常简单。

但在一些示例中,我看到了 unSubscribeOn 运算符用于使取消订阅在特定线程中进行。我有点不明白这样做的实际需要。事实上我从来没有使用过它,我也没有因为不使用它而导致任何内存泄漏。

这是我们需要一直使用的东西吗?或者有人可以解释一些我们需要使用 unSubscribeOn 的用例吗?

我也引用了官方文档和一些示例,但有点没有消化它。如果有人可以用示例进行解释,那将非常有帮助。

最佳答案

如果您设置了 subscribeOn 和observeOn 并且没有设置 unsubscribeOn ,典型的行为是,取消订阅发生在与observeOn相同的线程中。

如果只设置了 subscribeOn ,没有observeOn、unSubscribeOn,则取消订阅发生在 subscribeOn 线程。

如果您想在取消订阅期间运行长时间运行的任务,则 unSubscribeOn 将很有用。

您可以针对每个场景使用 Thread.currentThread().getId() 运行上述测试。

关于android - 何时在 rxjava 中使用 `unSubscribeOn`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50669004/

相关文章:

android - RX JAVA + Retrofit sdk 使用 Swagger codegen 生成

android - 下载的播客的音频问题

java - JSON解析子项而不使用任何库

java - RxJava 可完成连接

java - RxAndroid 链式操作

java - 为什么onNext没有效果

android - 如何使用 Material Design Animation 填充另一个 View ?

android - 在运行 Android 8.0.0 (Oreo) 的 Android 虚拟设备上找不到开发人员选项

android - RxJava : catch exception properly

android - Mockito.verify 没有看到方法执行,即使它是