Добрый день, помогите неучу с подобной задачкой.
Есть 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();
}
Т.к. при увеличении запросов появляется копипаста, то уверен, что можно сделать красиво, но не знаю как.
Коллеги поделитесь опытом с новичком, спасибо большое!
Подобные решения легко можно найти.
Если в кратко, то делать надо так
Observable.zip(observable1,observable2,observable3,Func)
Если необходимо обработать результат каждого отдельно, то можно предварительно сделать так observableN.doOnNext()
ЗЫ: сабжекты не вздумайте использовать для такого.
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)
ЗЫ писал по памяти, так что возможно придется напильником доработать
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем доброго дняПомогите с решением проблемы парсинга xml без тегов, т
Я новичок в java, подскажите что я делаю не такПроблема заключается в том что мне нужно по мере скролинга добавлять все новый и новый контент
В запросе sessioncreateQuery возникает ошибка "cannot find symbol symbol: variable goods", хотя класс goods есть - описан в файле shop