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