Как реагировать на колбэки из другого класса 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 шт):

Автор решения: Alex_Skvortsov

Ваш репозиторий:

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, но не подписку. Архитектурно обычно именно такой подход используется.

→ Ссылка