3

onBackpressureBuffer で奇妙な動作を確認しましたが、これが有効な動作なのかバグなのかわかりません。

特定のレートでアイテムを放出するtcp呼び出しを行っています(ストリーミングとinputStreamを使用していますが、それはいくつかの情報のためだけです)

その上に、準備が整うたびにアイテムを発行する create を使用してオブザーバブルを作成しました。

それをメッセージ()と呼びましょう。

それから私はこれをやっています:

messages()
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe({//do some work});

MissingBackPressureException がめったにスローされない分析ツールを使用していることに気付いたので、呼び出しに onBackpressureBuffer を追加しました。

後に追加する場合observeOn

messages()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .onBackpressureBuffer()
    .subscribe({//do some work})

すべて正常に動作しますが、UI メインスレッドに到達した後にのみバッファリングされることを意味するため、次のようにすることを好みました。

messages()
    .onBackpressureBuffer()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({//do some work});

そして、物事が奇妙になり始めるところです。

while がアイテムを放出し続けることに気付きましたが、messages()ある時点でサブスクライバーへの配信が停止します。

より正確には、ちょうど 16 個のアイテムの後、明らかに起こっていることは、バッファーがアイテムを転送せずに保持し始めることです。

messages()ある種のタイムアウトメカニズムでキャンセルすると、発行がmessages()発生onError()し、バッファは保持していたすべてのアイテムをすぐに発行します (それらは処理されます)。

あまりにも多くの作業を行った加入者のせいであるかどうかを確認しましたが、そうではありません。彼は終了しましたが、まだアイテムを取得していません...

request(n)また、終了後に 1 つの項目を要求するサブスクライバーでメソッドを使用しようとしましonNext()たが、バッファーは動作しません。

メインの Android UI スレッドのメッセージング システムがバックプレッシャーを引き起こしていると思われますが、その理由は説明できません。

誰かがなぜこれが起こっているのか説明できますか? これはバグですか、それとも有効な動作ですか? Tnx!

4

2 に答える 2