параллельные запросы

297
26 апреля 2017, 09:57

Добрый день, помогите неучу с подобной задачкой.

Есть N запросов до сервера, они не зависимы друг для друга, поэтому есть желание выполнить их параллельно. Вопрос в том как их правильно организовать. Сейчас я делаю для каждого из них флаги и проверяю все ли корректно отработало, и по итогу ставлю результат.

Выглядит как-то так:

private void loadDataFromServer() {
    loadUserInfo();
    loadProfileInfo();
}
private void loadUserInfo() {
    Subscription subscription = mService.getUserMe()
            .compose(Utils.applySchedulers())
            .subscribe(userModel -> {
                        UserDataUtils.setUserInfo(userModel);
                        isUserInfoLoaded = true;
                        checkLoadFinished();
                    },
                    throwable ->
                            isSuccess = false);
    unsubscribeOnDestroy(subscription);
}
private void loadProfileInfo() {
    Subscription subscription = mService.getProfileInfo()
            .compose(Utils.applySchedulers())
            .subscribe(accountInfoModel -> {
                        isProfileInfoLoaded = true;
                        UserDataUtils.setAccountInfo(accountInfoModel);
                        checkLoadFinished();
                    },
                    throwable ->
                            isSuccess = false);
    unsubscribeOnDestroy(subscription);
}
private void checkLoadFinished() {
    if (isSuccess) {
        if (isUserInfoLoaded && isProfileInfoLoaded) {
            loadSuccess();
        }
    } else {
        loadFailed();
    }
}
private void loadSuccess() {
    getViewState().showBaseFragment();
    getViewState().hideProgressDialog();
    getViewState().blockNavigation(false);
    getViewState().updateNavigationMenu();
}
private void loadFailed() {
    getViewState().blockNavigation(true);
    getViewState().showError(R.string.error_no_internet_connection);
    getViewState().hideProgressDialog();
}

Т.к. при увеличении запросов появляется копипаста, то уверен, что можно сделать красиво, но не знаю как.

Коллеги поделитесь опытом с новичком, спасибо большое!

Answer 1

Подобные решения легко можно найти. Если в кратко, то делать надо так
Observable.zip(observable1,observable2,observable3,Func)
Если необходимо обработать результат каждого отдельно, то можно предварительно сделать так observableN.doOnNext()

ЗЫ: сабжекты не вздумайте использовать для такого.

Answer 2
public PublishSubject<Boolean> progress = PublishSubject.create();

Перед запуском запросов:

progress
    .take(3)
    .all(result -> result)
    .subscribe(result -> {
        if (result){
            loadSuccess();
        } else loadFailed();
    });

В каждом запросе

progress.next(true)

Или

progress.next(false)

ЗЫ писал по памяти, так что возможно придется напильником доработать

READ ALSO
Куда делся RequiresApi в AndroidStudio?

Куда делся RequiresApi в AndroidStudio?

Добрый день, не могу импортировать RequiresApi

245
Как распарсить XML инструментами Java?

Как распарсить XML инструментами Java?

Всем доброго дняПомогите с решением проблемы парсинга xml без тегов, т

439
Динамическая подгрузка контента onScroll

Динамическая подгрузка контента onScroll

Я новичок в java, подскажите что я делаю не такПроблема заключается в том что мне нужно по мере скролинга добавлять все новый и новый контент

241
Ошибка hibernate java

Ошибка hibernate java

В запросе sessioncreateQuery возникает ошибка "cannot find symbol symbol: variable goods", хотя класс goods есть - описан в файле shop

245