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::onDestroyView
或 Fragment::onStop
而不是 Fragment::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::onDestroyView
或 Fragment::onStop
而不是 Fragment::onDestroy