RxJava2 Android onNext 即使在处理 compositeDisposable onDestroy 之后也会被调用

RxJava2 Android onNext is called even after disposing compositeDisposable onDestroy

以下是我将可观察对象添加到复合一次性对象的代码

compositeDisposable.add(retrofit.create(APIService.class).getHomePageItems(homePageRequestParam.buildPost(), homePageRequestParam.build())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .onTerminateDetach()
            .subscribeWith(new DisposableObserver<HomePageResult>() {
                @Override
                public void onNext(HomePageResult result) {
                    appView.onHomePageResponse(result);
                }

                @Override
                public void onError(Throwable e) {
                    appView.onHomePageError();
                }

                @Override
                public void onComplete() {
                }
            }));

在 Fragment destroy 上,我调用如下所示的 presenter stop() 方法。

 @Override
public void onDestroy() {
    super.onDestroy();
    appPresnter.setView(null);
     appPresnter.onStop();
}

如下所示清除和处理 Presenter 内部的 observable

 @Override
public void onStop() {
    compositeDisposable.dispose();
    compositeDisposable.clear();


}

但即使片段不可用,我仍然会调用 onNext,并且出现空指针异常。

 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

为什么会这样?

您在清除 CompositeDisposable 之前将 view 设置为 null,从而允许在处理前进行 onNext() 调用:

这个:

appPresnter.setView(null);
appPresnter.onStop();

应转为:

appPresnter.onStop();
appPresnter.setView(null);

Fragment::onDestroyViewFragment::onStop 而不是 Fragment::onDestroy

中进行清理也可能有意义