以下是我的代码,用于将可观察的对象添加到复合一次性对象
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
为什么会这样?
答案 0 :(得分:1)
您需要先将view
设置为null
,然后再清除CompositeDisposable
,以便在处置之前进行onNext()
通话:
此:
appPresnter.setView(null);
appPresnter.onStop();
应转置为:
appPresnter.onStop();
appPresnter.setView(null);
用Fragment::onDestroyView
或Fragment::onStop
而不是Fragment::onDestroy
进行清理也很有意义