Как реагировать на колбэки из другого класса RxJava
У меня есть метод toLogin в презенторе, который должен авторизовывать пользователя и вызывать соответствующие методы у Activity:
@Override
public void toLogin(String email, String password) {
if(!validateEmail(email) | !validatePassword(password)) {
return;
}
loginView.showDialog();
LoginRequest loginRequest = new LoginRequest(email, password);
LoginInterface loginApi = ApiClient.getClient().create(LoginInterface.class);
Single<LoginResponse> single = loginApi.getLogin(loginRequest);
single
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<LoginResponse>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(LoginResponse loginResponse) {
preferences.saveToken(loginResponse.getToken());
preferences.setLogin(true);
loginView.hideDialog();
loginView.onSuccess();
}
@Override
public void onError(Throwable e) {
loginView.hideDialog();
loginView.onFailed(R.string.check_data_correct);
}
});
}
Я хочу вынести этот запрос в отдельный класс DataRepository:
public class DataRepositoryImpl implements DataRepository {
private PreferencesUtil preferences;
public DataRepositoryImpl(PreferencesUtil preferences) {
this.preferences = preferences;
}
@NotNull
@Override
public Single<LoginResponse> login(String email, String password) {
LoginRequest loginRequest = new LoginRequest(email, password);
LoginInterface loginApi = ApiClient.getClient().create(LoginInterface.class);
Single<LoginResponse> single = loginApi.getLogin(loginRequest);
single
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<LoginResponse>() {
@Override
public void onSubscribe(Disposable d) {
//TODO
}
@Override
public void onSuccess(LoginResponse loginResponse) {
preferences.saveToken(loginResponse.getToken());
preferences.setLogin(true);
Log.d("TAG", "SUCCESSFUL");
}
@Override
public void onError(Throwable e) {
Log.d("TAG", "ERROR");
}
});
return single;
}
Вопрос: Как из презентора понять, какой колбэк отработал onSuccess или onError, что бы я мог вызвать соответствующие методы у активити (скрыть прогрессбар, открыть MainActivity и т.д)
Ответы (1 шт):
Ваш репозиторий:
public class DataRepositoryImpl implements DataRepository {
private PreferencesUtil preferences;
public DataRepositoryImpl(PreferencesUtil preferences) {
this.preferences = preferences;
}
@NotNull
@Override
public Single<LoginResponse> login(String email, String password) {
LoginRequest loginRequest = new LoginRequest(email, password);
LoginInterface loginApi = ApiClient.getClient().create(LoginInterface.class);
return loginApi.getLogin(loginRequest)
.doOnSuccess(loginResponse -> // синтаксис могу напутать с лямбдами, ибо в java ими не пользовался
preferences.saveToken(loginResponse.getToken());
preferences.setLogin(true);
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
И Ваш код в презентере:
public void callApi(String email, String password){
repository.login(email, password)
.subscribe(new SingleObserver<LoginResponse>() {
@Override
public void onSubscribe(Disposable d) {
//TODO
}
@Override
public void onSuccess(LoginResponse loginResponse) {
Log.d("TAG", "SUCCESSFUL");
}
@Override
public void onError(Throwable e) {
Log.d("TAG", "ERROR");
}
});
}
Подписка при работе с Rx в Андроиде должна выполняться либо в презенторе, либо во фрагменте/активити. Репозитории и другие подобные сущности используют операторы onNext/onComplete/onError, но не подписку. Архитектурно обычно именно такой подход используется.