即使在处理了CompositeDisposable onDestroy之后,仍会调用RxJava2 Android onNext

时间:2019-04-17 09:55:01

标签: android android-fragments observable rx-java2 android-mvp

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

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() {
                }
            }));

在“碎片销毁”上,我正在按如下方式调用presenter stop()方法。

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

清除和放置可在演示者内部看到的内容

 @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

为什么会这样?

1 个答案:

答案 0 :(得分:1)

您需要先将view设置为null,然后再清除CompositeDisposable,以便在处置之前进行onNext()通话:

此:

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

应转置为:

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

Fragment::onDestroyViewFragment::onStop而不是Fragment::onDestroy进行清理也很有意义