我在Android中使用RxJava2,但遇到以下问题,但它并非特定于Android。
我有一个PublishSubject
来推送我的所有事件。我根据不同的事件在代码的多个部分中调用publishSubject.onNext()
。但是我在代码中占据了中心位置,可以订阅这些事件。以下是订阅代码:
publishSubject
.observeOn(Schedulers.computation())
.map(
// each computation takes about 10ms
// Do some computation and return a `computation` object
)
.observerOn(AndroidSchedulers.mainThread())
.subscribe(
// take the `computation` object and draw on screen
// each drawing takes about 100ms
);
现在,在上述情况下,如果我呼叫
publishSubject.onNext()
100次,那么computation
将执行100次,而在屏幕上绘制将进行100次。我关心的是100倍的计算。每个事件都必须计算。但是,并非每个计算对象都需要绘制。
当在屏幕上绘制第一个
computation
对象时,需要花费100ms的时间在MAIN线程中绘制,但是到那时,在COMPUTATION线程中将生成10个新的computation
对象。因此,我第二次在屏幕上绘制时,我不想绘制第二个computation
对象,而是想要获得最新的computation
对象(可能是第11个计算对象)。简而言之,我正在寻找一种可以一直进行所有计算的方法,但是只能在屏幕上绘制当时可用的最新计算对象。
最佳答案
你尝试过这样的事情吗?
publishSubject
.observeOn(Schedulers.computation())
.map(...)
.toFlowable(BackpressureStrategy.LATEST)
.observerOn(AndroidSchedulers.mainThread())
.subscribe(...);
这将确保计算确实发生,但是订阅将不会接收到时间上太远的项目。