2015-10-06 56 views
0

我有一个布尔可观察值(通过观察者)启动和停止Android服务。当传递true时,服务必须立即启动。当错误通过时,如果不久之后出现真实情况,我想撤消它,以避免不必要的(和破坏性的)停止和启动服务。是否有标准操作员的组合可以做到这一点,或者我必须写我自己的,如果是的话,我应该基于OperatorDebounceWithTime.java还是有一个更简单的方法?谢谢!在布尔可观察值中仅去除假值

+0

你可以在debouncer之前应用'distinctUntilChanged'。 – akarnokd

+0

我认为我对这个问题的答案适用于这里:http://stackoverflow.com/questions/30676731/timer-rxjava-control-system-function/30693365#30693365 –

回答

4

它看起来像你想要的版本debounce(Func1),让你为每个项目发射定义一个自定义的去抖动窗口。它需要一个函数为源Observable发出的每个项目返回一个Observable。如果源Observable在这个新生成的Observable终止之前发射另一个项目,则去抖动将抑制该项目。

例如,以下代码将立即发出true值,并在发射它们之前持续保持false值2秒。如果源在定时器到期之前发出另一个true值,则将禁止false

deviceTrigger 
    .distinctUntilChanged() 
    .debounce(startDevice -> startDevice 
       ? Observable.empty() 
       : Observable.timer(2, TimeUnit.SECONDS)) 
    .distinctUntilChanged(); 

注意,取决于如果源可观察已经是不同的,你的消费在连续处理多个truedistinctUntilChanged()电话可能没有必要。

+0

辉煌!我知道debounce()这个变种,但是并没有意识到这个函数占用了每个元素,并且可以根据每个元素来决定。 –