Я хочу связать три сетевых звонка с RxJava
и Retrofit
. Первый вызов (извлекает токен сеанса) должен быть первым, остальные два зависят от этого вызова, и если первый вызов еще не закончен, другие два вызова приведут к ошибке.Запросы и обновление RxJava запросов к сети
Для двух других вызовов они должны получить некоторую информацию и обновить пользовательский интерфейс. Какой будет лучший способ? Сначала я подумал об использовании zip Operator
, но я не уверен, соблюдает ли он порядок запросов и, когда он возвращает значение, ему казалось, что он злоупотребляет им, чтобы просто использовать его для объединения запросов без дальнейшей обработки.
Мой второй подход состоял бы в том, чтобы плоские запросы и использовать doOnNext для обновления интерфейса один раз, но я не уверен, что это правильный путь.
private void setUpInitialUIState() {
restClient.requestSessionToken()
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
.flatMap(new Func1<SessionTokenResponse, Observable<CurrentPlmnResponse>>() {
@Override
public Observable<CurrentPlmnResponse> call(SessionTokenResponse sessionTokenResponse) {
return restClient.requestCurrentPlmn();
}
})
.doOnNext(new Action1<CurrentPlmnResponse>() {
@Override
public void call(CurrentPlmnResponse currentPlmnResponse) {
if (!currentPlmnResponse.isError()) {
tvProvider.setText(currentPlmnResponse.getData().getFullName());
}
}
})
.flatMap(new Func1<CurrentPlmnResponse, Observable<MonitoringStatusResponse>>() {
@Override
public Observable<MonitoringStatusResponse> call(CurrentPlmnResponse currentPlmnResponse) {
return restClient.requestMonitoringStatus();
}
})
.subscribe(new Subscriber<MonitoringStatusResponse>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
Log.d("onError", throwable.toString());
}
@Override
public void onNext(MonitoringStatusResponse monitoringStatusResponse) {
if (monitoringStatusResponse != null && !monitoringStatusResponse.isError() && monitoringStatusResponse.getData().getSignalIcon() >= 0 && monitoringStatusResponse.getData().getSignalIcon() <= 5) {
ivSignalStrength.setImageResource(getResources().getIdentifier("ic_signal_" + monitoringStatusResponse.getData().getSignalIcon(), "drawable", getPackageName()));
tvNetworkType.setText(getNetworkTypeTitle(monitoringStatusResponse.getData().getCurrentNetworkType()));
}
}
});
}
Хедж, вызов 2 и 3 может выполняться параллельно. Я откажусь от подписки на звонок, спасибо за напоминание :) В двух других пунктах я забыл изменить свои вспомогательные методы, RxFunctions applySchedulers()) - это Transformer, который добавляет следующих подписчиков: .subscribeOn (Schedulers.io()) .unsubscribeOn (Schedulers.io()) .observeOn (AndroidSchedulers.mainThread()); } }; } И TimberErrorLoginSubscriber также охватывает onError, я изменю его в вопросе выше. –
Eve
@ Все, но вернемся к вашему оригинальному вопросу. Затем используйте 'zip'. Это нормально :) – Diolor
ОК спасибо, я сделаю это :) – Eve