運作結果
運作效果:從效果圖上可以看出,合并兩個的觀察對象資料項應該是相等的;如果出現了資料項不等的情況,合并的資料項以最小資料隊列為準。
運作效果:
第一次發射得到1,作為結果與2相加;發射得到3,作為結果與3相加,以此類推,列印結果:
運作效果
take :取前n個資料
takeLast:取後n個資料
first 隻發送第一個資料
last 隻發送最後一個資料
skip() 跳過前n個資料發送後面的資料
skipLast() 跳過最後n個資料,發送前面的資料
運作結果
使用場景:xx秒後,執行xx
timer 傳回一個 Observable , 它在延遲一段給定的時間後發射一個簡單的數字0
timer 操作符預設在computation排程器上執行,當然也可以用 Scheduler 在定義執行的線程。
delay 、timer 總結:
相同點:delay 、 timer 都是延時操作符。
不同點:delay 延時一次,延時完成後,可以連續發射多個資料。timer延時一次,延時完成後,隻發射一次資料。
使用場景:從網絡請求資料,在資料被展示前,緩存到本地
Buffer( int n ) 把n個資料打成一個list包,然後再次發送。
Buffer( int n , int skip) 把n個資料打成一個list包,然後跳過第skip個資料。
使用場景:一個按鈕每點選3次,彈出一個toast
例子2:
在一段時間内,隻取第一個事件,然後其他事件都丢棄。
使用場景:1、button按鈕防抖操作,防連續點選 2、百度關鍵詞聯想,在一段時間内隻聯想一次,防止頻繁請求伺服器
這段代碼,是循環發送資料,每秒發送一個。throttleFirst( 3 , TimeUnit.SECONDS ) 在3秒内隻取第一個事件,其他的事件丢棄。
從結果可以看出,重複的資料已經被過濾掉了
distinctUntilChanged() 過濾連續重複的資料
運作結果
從結果可以看出,連續重複的資料已經被過濾掉了
一段時間内沒有變化,就會發送一個資料。
使用場景:百度關鍵詞聯想提示。在輸入的過程中是不會從伺服器拉資料的。當輸入結束後,在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包含最新的資料。