我一直在使用RxJava。我使用subscribeOn
和observeOn
运算符来管理线程。我使用subscribeOn
在io
或computation
线程中启动可观察的发射,并使用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
以便,如果我的活动或片段在观察者在后台线程中做某事时超出了范围,我可以安全地断开连接链中的观察者避免任何内存泄漏。很简单。
但在某些示例中,我看到unSubscribeOn
运算符用于使取消订阅位于特定线程中。我有点不理解实际需要。事实上,我从来没有使用过它,我没有通过不使用它来结束任何内存泄漏。
我们需要始终使用它吗?或者,任何人都可以解释我们需要去unSubscribeOn
的一些用例吗?
我已经提到了官方文档和一些例子,但有点没有消化它。如果有人可以用样品解释,那将非常有帮助。
答案 0 :(得分:2)
如果设置了subscribeOn和observeOn而没有设置unsubscribeOn,典型的行为是,取消订阅发生在与observeOn相同的线程中。
如果只设置了subscribeOn,而没有设置observeOn,没有设置unSubscribeOn,则取消订阅会发生在subscribeOn线程上。
如果您想在取消订阅期间运行长时间运行的任务,则unSubscribeOn将非常有用。
您可以使用 Thread.currentThread()。getId()为每个方案运行上述测试。