2016-09-04 4 views
1

У меня возникла проблема с тем, что мне нужен токен аутентификации для создания моей службы переоснащения. Я в настоящее время использую наблюдаемый для получения указанных маркеров, в результате чего довольно уродливое Observable конструкции:RxJava - Вложенные наблюдения? (Дооснащение)

Observable<MyService> observable = application.getMyService(); 
    observable.observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(application.defaultSubscribeScheduler()) 
      .subscribe(new Subscriber<MyService>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 
        Log.e(TAG, "Error creating service: ", e); 
       } 

       @Override 
       public void onNext(MyService myService) { 
        subscription = myService.searchStuff(searchFor) 
          .observeOn(AndroidSchedulers.mainThread()) 
          .subscribeOn(application.defaultSubscribeScheduler()) 
          .subscribe(new Subscriber<AResponseWrapper>() { 
           @Override 
           public void onCompleted() { 

           } 

           @Override 
           public void onError(Throwable error) { 
            Log.e(TAG, "Error loading stuff: ", error); 
           } 

           @Override 
           public void onNext(AResponseWrapper wrapper) { 
            MainPresenter.this.stuff = wrapper.getStuff(); 
           } 
          }); 
       } 
      }); 

Я не могу помочь, но чувствую, что это не так, как это должно быть сделано. Я прав?

+1

вы можете найти этот ответ полезным: http://stackoverflow.com/a/28406931/5036979 –

+1

@AhmedAshrafG отлично, спасибо! Ранее я рассматривал только принятый ответ на этот вопрос, который меня смутил из-за использования Карт. Это заставило меня предположить, что flatMap полезен только при работе с Картами. – Zackline

ответ

1

Observable.flatMap - это то, что я искал. Это позволяет отображать результат в другой наблюдаемой:

Observable<MyService> observable = application.getMyService(); 
    subscription = observable 
      .observeOn(application.defaultSubscribeScheduler()) 
      .subscribeOn(application.defaultSubscribeScheduler()) 
      .flatMap(service -> service.searchStuff(searchFor)) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<AResponseWrapper>() { 
       @Override 
       public void onCompleted() { 
        if (series.size() < 1) { 
         mainView.showMessage(R.string.no_stuff_found); 
        } else { 
         mainView.showStuff(stuff); 
        } 
       } 

       @Override 
       public void onError(Throwable error) { 
        Log.e(TAG, "Error loading stuff: ", error); 
       } 

       @Override 
       public void onNext(AResponseWrapper wrapper) { 
        MainPresenter.this.stuff= wrapper.getStuff(); 
       } 
      }); 

Обратите внимание, что я первый наблюдать на IO Scheduler, и только после flatMap я подписываться на главном потоке. В противном случае вызов service.searchStuff (по крайней мере, я думаю, это та часть) будет выполнен в основном потоке, давая NetworkOnMainThreadException.

Спасибо @ ahmed-ashraf-g, который указал мне на это answer.

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