【问题标题】:RxJava Observable minimum execution timeRxJava Observable 最小执行时间
【发布时间】:2016-06-27 19:10:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: java rx-java reactivex


    【解决方案1】:

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

    Observable<Response> network = ...
    

    一个人做得到

    Observable<Integer> readyNotification = Observable.just(42).delay(1, TimeUnit.SECONDS);
    Observable delayedNetwork = network.zipWith(readyNotification, 
                                                    (response, notUsed) -> response);
    

    【讨论】:

    • 1) 为什么不只使用timer? 2)请注意,网络可能会在超时之前失败。如果您想确保始终使用超时,请尝试mergeDelayError,然后使用例如reduce 将两个项目转换为一个。
    • 2) 可以在 network 之后用 materialize() 解决,在 zipWith() 之后用 dematerialize() 解决。不确定 mergeDelayError() 与建议的解决方案的相关性 - 您可以评论原始问题或将其添加为另一个答案
    • mergeWithDelay 将确保,如果一个序列中断,另一个序列要么成功完成,要么返回错误(并且不会提前取消订阅)。取决于作者想要实现的问题。
    【解决方案2】:

    使用Observable.concatEager()

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

    Observable<Response> responseObservable = ...;
    
    Observable<Response> responseWithMinDelay = Observable.concatEager(
                        Observable.timer(1, TimeUnit.SECONDS).ignoreElements(),
                        responseObservable
    ).cast(Response.class);
    

    【讨论】:

      【解决方案3】:

      看起来 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 */ }
      

      【讨论】:

      • 我遇到了同样的错误问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多