使用RxJava2创建一个带有generate函数的flowable

时间:2017-11-09 07:30:20

标签: java kotlin observable rx-java2 backpressure

我需要创建一个带有背压的自定义Flowable。我正在尝试实现某种分页。这意味着当下游请求5个项目时,我将“向数据源”询问项目0-5。然后,当下游需要另外5个项目时,我将获得项目5 - 10并发回。

到目前为止我发现的最好的事情是使用Flowable.generate方法,但我真的不明白为什么没有办法(据我所知)如何得到requested数字下游要求的项目。我可以使用生成器的state属性来保存请求的最后项目的索引,这样我只需要新请求的项目数。我在BiFunction apply中获得的emmiter实例是GeneratorSubscription,它从AtomicLong延伸。因此,向AtomicLong投射发射器可以获得所需的数字。但我知道这不是“推荐”的方式。

另一方面,当您使用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*/
    })

1 个答案:

答案 0 :(得分:0)

好的,我发现BiFunction的apply函数被多次调用,就像请求数量(n)一样。所以没有理由为它吸气。这不是我所希望的,但显然generate是如何运作的。 :)