Following is my code for adding observable to composite disposable
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() {
}
}));
On Fragment destroy I am calling presenter stop() method as below.
@Override
public void onDestroy() {
super.onDestroy();
appPresnter.setView(null);
appPresnter.onStop();
}
Clearing and disposing observable inside presenter as below
@Override
public void onStop() {
compositeDisposable.dispose();
compositeDisposable.clear();
}
But still onNext is called even though fragment is not available and I am getting null pointer exception.
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
Why it is happening?
You are setting the view
to null
before clearing the CompositeDisposable
allowing for an onNext()
call before disposal:
This :
appPresnter.setView(null);
appPresnter.onStop();
Should be transposed to :
appPresnter.onStop();
appPresnter.setView(null);
Also probably makes sense to do your clear up in Fragment::onDestroyView
or Fragment::onStop
rather than Fragment::onDestroy