Search code examples
androidrx-javamvp

RxJava: auto unsubscribe in Android MVP


i use RxJava/Retrofit in Android App with MVP Pattern.

now i want to clean the xxxPresenter when the Activity/Fragment destroy for prevent oom.

the Presenter simple code:

public class LoginPresenter {

    private LoginView mLoginView;
    private LoginMode mLoginMode;
    private Subscriber mLoginSubscriber;

    public LoginPresenter(LoginView loginView) {
        this.mLoginView = loginView;
        mLoginMode = new LoginMode();
    }

    void login(String userName, String pwd) {
        mLoginSubscriber = new Subscriber() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Object o) {
                if (mLoginView != null) {
                    mLoginView.onLoginSuccess();
                }
            }
        };
        mLoginMode.login(userName, pwd, mLoginSubscriber);
    }

    void destory() {
        mLoginView = null;
        mLoginSubscriber.unsubscribe();
    }

}

when the Activity/Fragment destory will call presenter's destory() method

my problem is:

if a presenter has more network request i will hold a lot of subscriber members, has any way to let the subscriber auto unsubscribe when Activity/Fragment destory?


Solution

  • I think what you need is CompositeSubscription. It is a container for subscriptions which allows you to unsubscribe them all at once.

    public class LoginPresenter {
    
        private LoginView mLoginView;
        private LoginMode mLoginMode;
        private CompositeSubscription mSubscriptions;
    
        public LoginPresenter(LoginView loginView) {
            this.mLoginView = loginView;
            mLoginMode = new LoginMode();
            mSubscriptions = new CompositeSubscription();
        }
    
        void login(String userName, String pwd) {
            Subscription loginSubscriber = new Subscriber() {
                @Override
                public void onCompleted() {
    
                }
    
                @Override
                public void onError(Throwable e) {
    
                }
    
                @Override
                public void onNext(Object o) {
                    if (mLoginView != null) {
                        mLoginView.onLoginSuccess();
                    }
                }
            };
            mLoginMode.login(userName, pwd, loginSubscriber);
            mSubscriptions.add(loginSubscriber);
        }
    
        void destory() {
            mLoginView = null;
            mSubscriptions.unsubscribe();
        }
    
    }