RxAndroid - 杀死一个人

时间:2018-02-05 19:14:52

标签: android rx-java2

我是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时停止。 有没有办法杀死这个过程? 因为演示者死了。没人会抓住结果。

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:2)

问题在于您生成的代码块。在复合一次性上调用dispose()clear()不会停止底层线程(因为年龄不可能)但会尝试中断它(发送中断信号)。由于您没有任何可以被中断的内容(例如,Thread.sleep(...)),该线程将继续运行。如果你想检查当前线程是否处于中断状态,你可以在循环中调用Thread.interrupted()(或者你正在做的任何事情)。

现在,回到订阅问题。保持生产者的工作不应该导致视图处理的任何问题,因为一旦丢弃一次性产品,它就不会收到任何值。