I need to create a custom Flowable with backpressure implemented. I'm trying to achieve some sort of paging. That means when downstream requests 5 items I will "ask the data source" for items 0 - 5. Then when downstream needs another 5, I'll get items 5 - 10 and emit back.
The best thing I've found so far is to use Flowable.generate
method but I really don't understand why there is no way (as far as I know) how to get the requested
number of items the downstream is requesting. I can use the state
property of generator to save the index of last items requested so then I need only the number of newly requested items. The emmiter instance I got in the BiFunction apply
is GeneratorSubscription
which is extending from AtomicLong
. So casting emmiter to AtomicLong
can get me the requested number. But I know this can't be the "recommended" way.
On the other hand when you use Flowable.create
you get the FlowableEmitter which has long requested()
method. Using generate
is suiting me more for my use-case, but now I'm also curious what is the "correct" way to use Flowable.generate
.
Maybe I'm overthinking the whole thing so please point me in the right direction. :) Thank you.
This is what the actual code looks like (in 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*/
})