我是RxJava的初学者。我的问题是下一个问题:来自Presenter
我在后台线程中调用了一个“Single
”,并带有一个AndroidS.mainThread()
观察者。
当我的屏幕处于onDestroyed时,它会调用演示者的OnViewDestroy
。这是一种释放记忆的方法。
在演示者中我使用CompositeDisposable
protected CompositeDisposable compositeDisposable = new CompositeDisposable();
创建我的Activity后,我调用此方法:(演示者的方法)
@Override
public void loadLibrary() {
compositeDisposable.add(repository.getLibraryName()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<String>() {
@Override
public void onSuccess(String libraryName) {
view.displayLibraryName(libraryName);
}
@Override
public void onError(Throwable e) {
view.displayLibraryNameError();
}
}));
}
工作正常。
但是当活动为destroyed
时,我就会清除CompositeDisposable
@Override
public void onViewDestroy() {
super.onViewDestroy();
compositeDisposable.clear();
}
它被称为。但是,repository.getLibraryName()
仍未在后台运行,但尚未完成。 (我看到日志仍在记录。)
@Override
public Single<String> getLibraryName() {
return Single.fromCallable(() -> {
int i = 0;
while(i != 55000){
i++;
Log.d("T","" + i);
}
return "Dummy";
});
}
i == 55000
时停止。
有没有办法杀死这个过程? 因为演示者死了。没人会抓住结果。
有什么建议吗?谢谢!
答案 0 :(得分:2)
问题在于您生成的代码块。在复合一次性上调用dispose()
或clear()
不会停止底层线程(因为年龄不可能)但会尝试中断它(发送中断信号)。由于您没有任何可以被中断的内容(例如,Thread.sleep(...)
),该线程将继续运行。如果你想检查当前线程是否处于中断状态,你可以在循环中调用Thread.interrupted()
(或者你正在做的任何事情)。
现在,回到订阅问题。保持生产者的工作不应该导致视图处理的任何问题,因为一旦丢弃一次性产品,它就不会收到任何值。