原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%204%20-%20Concurrency/3.%20Sequences%20of%20coincidence.mdjava
Rx試圖避免管道(pipeline)外的狀態,可是,有些事情本質上是有狀態的。好比服務器能夠啓動或關閉,移動設備能夠訪問wifi,按下按鈕。在Rx中,咱們將這些視爲具備一段持續時間的事件,咱們稱之爲窗口(windows)。在這些窗口內發生的其餘事件可能須要區別對待。例如,移動設備將推遲低優先級的網絡請求,同時使用更昂貴的通訊通道。ios
使用緩衝區(buffer),咱們能夠看到一個操做符,它能夠根據各類重載,將序列和組值轉換爲塊。窗口運算符與緩衝區具備一對一的關係。主要區別在於它不會以緩衝塊的形式返回組。相反,它返回一系列序列,每一個序列對應於原本是緩衝區的序列。這意味着每一個發出的observable一旦出如今source observable中就會發出它的值,而不是在窗口的末尾發出它們。經過下面的圖,能夠當即看出緩衝區和窗口之間的關係:git
使用window操做後:github
若是您還不熟悉緩衝區(buffer),我強烈建議您今後開始。兩個運算符中的重載和結果分組是相同的,但緩衝區更容易理解並提供示例。可使用相同的參數從窗口重載構造每一個緩衝區重載:windows
您能夠擁有固定數量元素的窗口。一旦窗口發出了所需數量的元素,則observable終止並開始新的元素。服務器
您也能夠跳過和重疊窗口像帶有window(int count,int skip)的buffer同樣。當窗口重疊時,它們將同時發射值,以下一個示例所示。網絡
輸出:ide
咱們能夠在這裏看到內部可觀察者同時發射相同的值。爲了更清楚地看到每一個observable發出的內容,讓咱們以不一樣的方式格式化輸出:函數
輸出:spa
經過將內部可觀察量轉換爲列表,咱們能夠看到相關窗口與緩衝區的關係。
您能夠擁有固定持續時間的窗口,而不是擁有固定大小的窗口。
您能夠構建重疊或跳過元素的windows,就像使用buffer同樣
public final Observable<Observable<T>> window(long timespan, long timeshift, java.util.concurrent.TimeUnit unit)
輸出:
在此示例中,新的window每100ms開始一次,持續250ms。第一個window在0ms時打開並保持打開足夠長的時間以捕獲[0,1](間隔在100ms時發出第一個值)。每一個後續窗口保持打開足夠長的時間以捕獲接下來的3個值,除非值中止。
最後,您可使用另外一個observable定義window。每當您的信號可觀察值發出一個值時,舊窗口關閉,一個新窗口開始。
或者,要具備重疊窗口,您能夠提供一個函數,該函數使用信號可觀察信號發出的值來構造另外一個能夠發出窗口關閉信號的observable。當observable終止時,相應的窗口關閉。
這是一個基於信號可觀察量的重疊窗口的示例
輸出:
此示例與前一示例相同:新window每100ms打開一次,持續250ms,但第一個窗口以100ms而不是0ms開始。可是,咱們看到結果有所不一樣。從時間100ms開始的窗口不會捕獲在100ms處發出的值,而且每隔一個窗口都會發生相同的值。發生這種狀況是由於窗口開始的間隔事件剛好在做爲值的間隔事件以後觸發。儘管這兩個事件在理論上是同時發生的,但實際上並無這樣的事情。
未完待續!
原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%204%20-%20Concurrency/3.%20Sequences%20of%20coincidence.md
git:https://github.com/woshiyexinjie/rxjava-leaner