天天看點

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

運作結果

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

  運作效果:從效果圖上可以看出,合并兩個的觀察對象資料項應該是相等的;如果出現了資料項不等的情況,合并的資料項以最小資料隊列為準。

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

  運作效果:

        第一次發射得到1,作為結果與2相加;發射得到3,作為結果與3相加,以此類推,列印結果:

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

  運作效果

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

take :取前n個資料

takeLast:取後n個資料

first 隻發送第一個資料

last 隻發送最後一個資料

skip() 跳過前n個資料發送後面的資料

skipLast() 跳過最後n個資料,發送前面的資料

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

  運作結果

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)
RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

  

      使用場景:xx秒後,執行xx      

     timer 傳回一個 Observable , 它在延遲一段給定的時間後發射一個簡單的數字0

    timer 操作符預設在computation排程器上執行,當然也可以用 Scheduler 在定義執行的線程。

 delay 、timer 總結: 

 相同點:delay 、 timer 都是延時操作符。

 不同點:delay  延時一次,延時完成後,可以連續發射多個資料。timer延時一次,延時完成後,隻發射一次資料。

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

       使用場景:從網絡請求資料,在資料被展示前,緩存到本地

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

Buffer( int n )      把n個資料打成一個list包,然後再次發送。

Buffer( int n , int skip)   把n個資料打成一個list包,然後跳過第skip個資料。

    使用場景:一個按鈕每點選3次,彈出一個toast      

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

     例子2: 

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

         在一段時間内,隻取第一個事件,然後其他事件都丢棄。

         使用場景:1、button按鈕防抖操作,防連續點選   2、百度關鍵詞聯想,在一段時間内隻聯想一次,防止頻繁請求伺服器   

這段代碼,是循環發送資料,每秒發送一個。throttleFirst( 3 , TimeUnit.SECONDS )   在3秒内隻取第一個事件,其他的事件丢棄。

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)
RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

從結果可以看出,重複的資料已經被過濾掉了

  distinctUntilChanged()  過濾連續重複的資料

 運作結果

RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和記憶體優化)

從結果可以看出,連續重複的資料已經被過濾掉了

       一段時間内沒有變化,就會發送一個資料。

       使用場景:百度關鍵詞聯想提示。在輸入的過程中是不會從伺服器拉資料的。當輸入結束後,在400毫秒沒有輸入就會去擷取資料。

                   避免了,多次請求給伺服器帶來的壓力.

        使用場景: 可以在事件發出之前做一些初始化的工作,比如彈出進度條等等

         注意:

             1、doOnSubscribe() 預設運作在事件産生的線程裡面,然而事件産生的線程一般都會運作在 io 線程裡。那麼這個時候做一些,更新UI的操作,是線程不安全的。

                 是以如果事件産生的線程是io線程,但是我們又要在doOnSubscribe() 更新UI , 這時候就需要線程切換。

             2、如果在 <code>doOnSubscribe()</code> 之後有 <code>subscribeOn()</code> 的話,它将執行在離它最近的 <code>subscribeOn()</code> 所指定的線程。   

             3、 subscribeOn() 事件産生的線程 ; observeOn() : 事件消費的線程

    首先看range 方法的源碼

 

Range操作符發射一個範圍内的有序整數序列,你可以指定範圍的起始和長度。

RxJava将這個操作符實作為<code>range</code>函數,它接受兩個參數,一個是範圍的起始值,一個是範圍的資料的數目。如果你将第二個參數設為0,将導緻Observable不發射任何資料(如果設定為負數,會抛異常)。

<code>range</code>預設不在任何特定的排程器上執行。有一個變體可以通過可選參數指定Scheduler。

例子

  結果

/rx_range: 10 /rx_range: 11 /rx_range: 12
/rx_defer: 12 /rx_just: 11

可以看到,just操作符是在建立Observable就進行了指派操作,而defer是在訂閱者訂閱時才建立Observable,此時才進行真正的指派操作。

<code>Defer</code>操作符會一直等待直到有觀察者訂閱它,然後它使用Observable工廠方法生成一個Observable。它對每個觀察者都這樣做,是以盡管每個訂閱者都以為自己訂閱的是同一個Observable,事實上每個訂閱者擷取的是它們自己的單獨的資料序列。

在某些情況下,等待直到最後一分鐘(就是知道訂閱發生時)才生成Observable可以確定Observable包含最新的資料。

下一篇: 跨域