【问题标题】:Rx Android: Debounce calls to compute and return last computed valueRx Android:去抖动调用以计算并返回最后计算的值
【发布时间】:2016-08-05 17:40:35
【问题描述】:

我是 Rx Android 的新手。我看到了像throttle & debounce这样的操作符;但是我无法弄清楚如何在我的场景中有效地使用它。

在我的 APP 中,从多个执行线程更新一些全局状态并请求执行代价高昂的计算。 计算需要在不同的线程上执行。调用者线程使用 Observable 接收计算结果。

可以有多个连续或并行调用来执行计算。我想将调用去抖动到特定的持续时间,并且所有调用者都应该收到最后计算的值。

例如。如果三个线程 T1、T2 和 T3 请求在 500 毫秒内执行计算,则计算只需执行一次。观察计算结果的所有线程 T1、T2 和 T3(Observer)获取最后的计算结果。

【问题讨论】:

  • 告发切换地图?
  • 是不是你想做 onTextChange 监听器??

标签: android multithreading rx-java rx-android


【解决方案1】:

这样的?

BehaviorSubject<Object> b = new BehaviorSubject();
Observable<T> computationChain = 
      b
      .onSubscribe(() -> b.onNext(null))
      .debounce(500, TimeUnit.MILLISECONDS)
      .observeOn(Schedulers.computation())
      .map(dummy -> performExpensiveComputation())
      .share();

....

public Observable<T> getComputation() {
    return computationChain;
}

....

getComputationChain().subscribe(value -> doSomething(value));

编辑:也许这会更好:

BehaviorSubject<Object> b = new BehaviorSubject();
Observable<T> computationChain = 
      b
      .debounce(500, TimeUnit.MILLISECONDS)
      .observeOn(Schedulers.computation())
      .map(dummy -> performExpensiveComputation())
      .publish();
      .onSubscribe(() -> b.onNext(null))

【讨论】:

  • 你能解释一下这行吗=> .onSubscribe(() -> b.onNext(null))。谢谢。
  • 也就是说,当有人订阅时,然后将订阅事件作为令牌值(null)推送到behaviorSubject,最后将被忽略(在map()中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多