RxJava可观测的最小执行时间

RxJava可观测的最小执行时间,java,rx-java,reactivex,Java,Rx Java,Reactivex,我有一个可观察的(从网络中获取数据)。 问题在于,可观测的速度可能快,也可能慢,这取决于网络条件 我在observable执行时显示进度小部件,在observable完成时隐藏它。当网络处于快速发展状态时,flikers(出现和消失)。我想将observable的最小执行时间设置为1秒。我该怎么做 “Delay”操作符不是一个选项,因为即使网络速度很慢,它也会延迟。您可以使用Observable.zip()。给定 Observable<Response> network = ...

我有一个可观察的(从网络中获取数据)。 问题在于,可观测的速度可能快,也可能慢,这取决于网络条件

我在observable执行时显示进度小部件,在observable完成时隐藏它。当网络处于快速发展状态时,flikers(出现和消失)。我想将observable的最小执行时间设置为1秒。我该怎么做


“Delay”操作符不是一个选项,因为即使网络速度很慢,它也会延迟。

您可以使用
Observable.zip()。给定

Observable<Response> network = ...
可观测网络=。。。
能行

Observable<Integer> readyNotification = Observable.just(42).delay(1, TimeUnit.SECONDS);
Observable delayedNetwork = network.zipWith(readyNotification, 
                                                (response, notUsed) -> response);
observeable readyNotification=observeable.just(42).delay(1,TimeUnit.SECONDS);
可观测延迟网络=network.zipWith(readyNotification,
(响应,未使用)->响应;

使用
Observable.concatEager()

它允许您强制一个流一个接一个地完成(concat operator),但也可以立即启动网络请求,而无需等待可观察到的第一个参数完成(concatEager):

可观测响应Observable=。。。;
可观测响应指数=可观测的concategar(
可观测计时器(1,TimeUnit.SECONDS).ignoreElements(),
可观测响应
).cast(Response.class);

看起来Observable.zip是一种合理的方法,在出现错误之前,它似乎工作得很好;然后它没有等到预期的时间

这似乎对我很有效:

Observable.mergeDelayError(
        useCase.execute(), // can return Unit or throw error
        Observable.timer(1, TimeUnit.SECONDS)
)
.reduce { _, _ -> Unit }
.doOnError { /* will wait at least 1 second */ }
.subscribe { /* will wait at least 1 second */ }

1) 为什么不直接使用定时器呢?2) 请注意,网络可能在超时之前发生故障。如果要确保始终使用超时,请尝试
mergeDelayError
,然后使用例如
reduce
将两个项目转换为一个。2)可以在网络之后使用materialize()解决,在zipWith()之后使用dematerialize()。不确定mergeDelayError()与建议解决方案的相关性-您可以评论原始问题或将其添加为另一个答案
mergeWithDelay
将确保,如果一个序列中断,另一个序列将成功完成或返回错误(而不是过早取消订阅)。取决于作者想要实现的问题。
Observable.mergeDelayError(
        useCase.execute(), // can return Unit or throw error
        Observable.timer(1, TimeUnit.SECONDS)
)
.reduce { _, _ -> Unit }
.doOnError { /* will wait at least 1 second */ }
.subscribe { /* will wait at least 1 second */ }