2016-09-04 11 views
1

Retrofitサービスを作成するために認証トークンが必要な問題に直面しています。私は助けるが、それが行われるべきか、これがないことを感じることができないRxJava - ネストされたオブザーバブル? (Retrofit)

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は私が探していたものです。 それは別の観測可能に結果をマッピングすることができます:私は最初のIOスケジューラに観察し、唯一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(); 
       } 
      }); 

注意。それ以外の場合はservice.searchStuffコール(少なくとも私はそれがその部分だと思う)がメインスレッドで実行され、NetworkOnMainThreadExceptionが返されます。

@ ahmed-ashraf-gのおかげで、このanswerに感謝します。

関連する問題