2016-02-23 3 views
1

Я хочу связать три сетевых звонка с 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())); 
         } 

        } 
       }); 
    } 

ответ

1

Зависит, если вы хотите, чтобы ваши 2-й и 3-й вызовы выполнялись параллельно или один за другим. Если параллельно идти на .zip и не чувствую себя плохо об этом :)

3 подсказки на вашей (текущий) код (возможно, вы знаете уже или немного отличаться в вашем приложении, так извинениями):

  • Поймайте подписку, возвращенную с .subscribe, и убейте (отпишитесь) на onDestroy последним. Если приложение закрывается, сетевые вызовы будут продолжать жить.
  • Если .requestCurrentPlmn() в теме, тогда .setText будет жаловаться на трогательный вид из исключения исключений ui.
  • Вы пропустите .onError в своей подписке. Если запрос не удался, приложение выйдет из строя.
+0

Хедж, вызов 2 и 3 может выполняться параллельно. Я откажусь от подписки на звонок, спасибо за напоминание :) В двух других пунктах я забыл изменить свои вспомогательные методы, RxFunctions applySchedulers()) - это Transformer, который добавляет следующих подписчиков: .subscribeOn (Schedulers.io()) .unsubscribeOn (Schedulers.io()) .observeOn (AndroidSchedulers.mainThread()); } }; } И TimberErrorLoginSubscriber также охватывает onError, я изменю его в вопросе выше. – Eve

+0

@ Все, но вернемся к вашему оригинальному вопросу. Затем используйте 'zip'. Это нормально :) – Diolor

+0

ОК спасибо, я сделаю это :) – Eve

Смежные вопросы