4

我有一个 Observable(从网络获取数据)。问题是 observable 可能快或慢,具体取决于网络条件。

我在 observable 执行时显示进度小部件,并在 observable 完成时隐藏它。当网络速度很快时 - 进步 flikers(出现和消失)。我想将 observable 的最小执行时间设置为 1 秒。我怎样才能做到这一点?

“延迟”运算符不是一个选项,因为即使对于慢速网络它也会延迟。

4

3 回答 3

7

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

Observable<Response> network = ...

一个可以做

Observable<Integer> readyNotification = Observable.just(42).delay(1, TimeUnit.SECONDS);
Observable delayedNetwork = network.zipWith(readyNotification, 
                                                (response, notUsed) -> response);
于 2016-06-27T20:22:41.113 回答
1

利用Observable.concatEager()

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

Observable<Response> responseObservable = ...;

Observable<Response> responseWithMinDelay = Observable.concatEager(
                    Observable.timer(1, TimeUnit.SECONDS).ignoreElements(),
                    responseObservable
).cast(Response.class);
于 2017-06-30T21:08:10.950 回答
1

看起来 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 */ }
于 2019-02-01T15:47:11.443 回答