2017-01-26 66 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