RxJava:自动退订 Android MVP

RxJava: auto unsubscribe in Android MVP

我在 Android 具有 MVP 模式的应用程序中使用 RxJava/Retrofit

现在我想在 Activity/Fragment 销毁时清理 xxxPresenter 以防止 oom

Presenter简单代码:

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();
    }

}

当 Activity/Fragment destory 将调用演示者的 destory() 方法时

我的问题是:

如果presenter有更多的网络请求,我会持有很多订阅者成员,有什么办法让订阅者在Activity/Fragment销毁时自动退订?

我想你需要的是CompositeSubscription。它是一个订阅容器,允许您一次取消订阅。

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();
    }

}