プロデューサ(APIリクエスト)がイベントをあまりに速く放出していて、コンシューマ(APIレスポンス)がAPIリクエストの2番目のレスポンスしか取得していないときにRxJavaに奇妙な問題が発生しています。Rxjava - hot observables
たとえば、サーバーからのクエリの一部に時間がかかるため、サーバーに送信してデータベースにクエリを送信する必要があるとします。だから、私が応答を受け取ったとき、第2の要求が最初に返される可能性があり、奇妙なことは時々私が最初の要求の応答を得ないことである。
API呼び出しを行うコード:
public void sendRequests() {
// using RxJava to make server polling.
startPollingServer();
}
startPollingServer()メソッドは、サーバーからデータをポーリングするRxJavaを使用することです。
public void startPollingServer() {
mApiService.getPollingFromServer()
.retryWhen()
.repeatWhen()
.map()
.subscribeOn()
.observeOn()
.subscribe(
// call onNext
// call onError
)
}
しかし、ときはsendRequests()onNext、onCompleteののどちらも、あまりにも速く呼び出している、のonErrorと呼ばれています。最初の要求に対して何も起こりません。 しかし私はCharlesProxyからの最初の応答を得ています。これは本当に奇妙です。
私の質問は、RxJavaが最初の応答を無視する可能性がありますか? startPollingServer()から来るObservablesをマージする必要がありますか?
Androidアプリケーションやテストで使用しますか?なぜなら、呼び出し元のスレッドがサブスクライブし、メソッドstartPollingServerを経由するだけなので、テストの場合は、スレッドが終了するからです。 voidメソッドをサブスクライブするだけではお勧めできません。サブスクリプションを廃棄しないと、メモリリークが発生します。 startPollingメソッドはObservable <>を返し、1か所で作成します。 –
私はアンドロイドアプリケーションでsendRequests()を使用していますが、ユーザがボタンやUIを非常に速く押すとシミュレートしています。それはちょうどいくつかのコードスニペットを示して、私はアプリケーションが破壊されたときにサブスクリプション購読を処理するコードを持っているので、メモリリークはありません – Cheng
なぜそれはRxJavaの問題です、確かにサーバーは本当にそれぞれのケースで応答を返しますか?Observablesの独立したストリームがここにあるようです。 – yosriz