2017-11-09 11 views
0

バックプレッシャを実装したカスタムFlowableを作成する必要があります。私はある種のページングを達成しようとしています。つまり、下流側で5つのアイテムをリクエストすると、アイテム0〜5を「データソースに尋ねる」ことを意味します。その後、下流で別の5が必要になると、アイテム5〜10が取得され、返されます。RxJava2を使用して生成関数を使用してフロアブルを作成する

Flowable.generateメソッドを使用するのが最善の方法ですが、実際には(私が知っている限り)どのようにダウンストリームが要求している項目の数を取得するのか理解できません。私は発電機のstateプロパティを使用して、最後に要求されたアイテムのインデックスを保存することができます。したがって、新しく要求されたアイテムの数だけ必要です。私がBiFunction applyに入れたemmiterのインスタンスは、AtomicLongから伸びているGeneratorSubscriptionです。だからAtomicLongに私は要求番号を得ることができるemmiterをキャスティング。しかし、私はこれが "推奨された"方法ではないことを知っています。

一方、Flowable.createを使用すると、long requested()メソッドを持つFlowableEmitterが得られます。 generateを使用すると、私のユースケースでもっと魅力的ですが、今ではFlowable.generateを使う正しい方法は何か不思議です。

多分私はすべてを徹底的に考えているので、正しい方向に向けるようにしてください。 :) ありがとうございました。

これは、実際のコードは、(Kotlinで)次のようになります。

Flowable.generate(Callable { 0 }, BiFunction { start /*state*/, emitter -> 
     val requested = (emitter as AtomicLong).get().toInt() //this is bull*hit 
     val end = start + requested 
     //get items [start to end] -> items 
     emmiter.onNext(items) 
     end /*return the new state*/ 
    }) 

答えて

0

[OK]を、私はBiFunctionのapply機能が要求量(n)が何回もすることを呼ばれていることが分かりました。だからゲッターを持つ理由はない。それは私が望んでいるものではありませんが、それは明らかにどのようにgenerateの作品です。 :)

関連する問題