2017-06-26 9 views
0

私はAPIを呼び出しています。アプリが起動すると、他の呼び出しを行うためにAPIからトークンを取得する必要があります。トークンは、アプリ内の「トークンマネージャー」によって管理されます。私はRxJava 2とRetrofit 2を使って呼び出しを管理しています。RxJava 2&Retrofit 2つの順次独立コール

私は、アプリケーションを起動すると、トークンマネージャトークンを取得し、フラグメントは、データを取得します。私はDagger 2で注入された同じRetrofitクライアントオブジェクトを使用しているため、呼び出しが順次実行されることを期待していました。 しかし、実際には、トークンを終了するために呼び出しの前にデータを取得する呼び出しが実行されます。トークンの場合、要求は失敗します。

フラットマップを使用することをお勧めするユーザーもいますが、アプリケーションの2つの異なる場所(TokenManagerクラスとFragment)でロジックが管理されています。 問題を解決するにはどうすればよいですか?

+0

はあなたがチェーンにしたいですあなたのAPIを呼び出すのでその一つは、常に他の後に呼ばれているのですか? – Apoorv

+0

これはいい考えです。 – Eselfar

+0

https://stackoverflow.com/questions/36785090/chaining-requests-in-retrofit-rxjava – Apoorv

答えて

1

フラットマップ()を使用することはできませんが、要件によっては、2つの呼び出しの一方が他方に依存しているようです。

とにかく可能性は以下の通りです:

依存通話 - 同じ場所(例えば活動)
その場合には、あなたが例えばflatMap()を使用する必要がありますが、AとBを呼び出し、呼び出しAはそうトークンを取得しなければなりませんBを実行することができます。
依存通話 - 別の場所(例えばサービス - 活動)
この状況に最も適合方法は、イベントバスで、あなたは、このようなイベントバスを実装するためにRxjavaからPublishSubjectを使用することができます。

あなたのケースでは、2番目の解決方法があります。 TokenMangerでTokenを取得し、必要な画面に通知すると、有効期限が通知される可能性があるため、アプリケーションがネットワークに不必要にヒットしないようにします。簡単な例として

PublishSubject<Token> publishToken = PublishSubject.create(); 

//notify others that you got a Token 
publishToken.onNext(myToken); 
.. 
.. 
//in other place (eg fragment) 
getTokenEventBus().subscribe(token -> { 
    //do your other call 
}, throwable ->{ 
    //handle error 
},() -> { 
    //event complete 
}); 
+0

フラットマップを使用して最終的に解決しましたが、あなたの答えは面白いです。質問はかなり古いように私はそれを受け入れるだろう – Eselfar

関連する問題