2017-01-26 55 views
1

这里有一个简单的观察到的例子:RXJava - 热观测 - 安全CPU资源

observable 
      .filter(...) 
      .buffer(50, TimeUnit.MILLISECONDS) 
      .doOnNext(/* this is executed all the time... */) 
      .filter(data -> data.size() > 0) 
      .doOnNext(/* this is not executed because of the filter above... */) 
      .flatMap(data -> Observable.from(data).distinctUntilChanged()) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(); 

问题/疑问

可观察到的,我从buffer(...)函数得到的是发射结果后的结果,大部分是空的那些。

过滤正确的方式来处理这个问题,像这样的observables?同时有很多这样的订阅会降低性能?或者应该以不同的方式处理?

回答

1

一般来说,是的,过滤出你不需要下游的东西。

同时会有很多这样的订阅性价比吗?

技术上:是的。更多的定时器,计算线程上更多的活动序列。但是,序列的开销可能远远小于您执行的业务逻辑。

为了节省一些开销,我会用flatMapIterable

observable 
    .filter(...) 
    .buffer(50, TimeUnit.MILLISECONDS) 
    .doOnNext(/* this is executed all the time... */) 
    .filter(data -> data.size() > 0) 
    .doOnNext(/* this is not executed because of the filter above... */) 
    .flatMapIterable(data -> data)    // <----------------------------- 
    .distinctUntilChanged() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(); 
+0

谢谢,这是我想知道的。我现在必须检查为什么这个设置不再需要'distinctUntilChanged'的嵌套调用,它的工作方式与我的示例相同... – prom85

+0

数据不是'Observable',而是'List',它没有Java中的distinctUntilChanged'。 – akarnokd

+0

我已经理解了,先想错了什么......谢谢 – prom85