Search code examples
androidandroid-fragmentsobservablerx-java2android-mvp

RxJava2 Android onNext is called even after disposing compositeDisposable onDestroy


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?


Solution

  • 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