RxJava:在Android MVP中自动取消订阅

xuy*_*jun 1 mvp android rx-java

我使用RxJava/ Retrofit在Android应用程序与MVP模式.

现在我想清理xxxPresenter什么时候Activity/Fragment为了防止破坏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();
    }

}
Run Code Online (Sandbox Code Playgroud)

当Activity/Fragment destory将调用presenter的destory()方法时

我的问题是:

如果主持人有更多的网络请求,我将拥有很多用户成员,有什么办法让用户在Activity/Fragment崩溃时自动取消订阅?

Jah*_*old 6

我想你需要的是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();
    }

}
Run Code Online (Sandbox Code Playgroud)