操作來自O(shè)bservable的發(fā)射物和通知
Subscribe
操作符是連接觀察者和Observable的膠水。一個(gè)觀察者要想看到Observable發(fā)射的數(shù)據(jù)項(xiàng),或者想要從Observable獲取錯(cuò)誤和完成通知,它首先必須使用這個(gè)操作符訂閱那個(gè)Observable。
Subscribe
操作符的一般實(shí)現(xiàn)可能會(huì)接受一到三個(gè)方法(然后由觀察者組合它們),或者接受一個(gè)實(shí)現(xiàn)了包含這三個(gè)方法的接口的對(duì)象(有時(shí)叫做Observer
或Subscriber
):
onNext
每當(dāng)Observable發(fā)射了一項(xiàng)數(shù)據(jù)它就會(huì)調(diào)用這個(gè)方法。這個(gè)方法的參數(shù)是這個(gè)Observable發(fā)射的數(shù)據(jù)項(xiàng)。
onError
Observable調(diào)用這個(gè)方法表示它無法生成期待的數(shù)據(jù)或者遇到了其它錯(cuò)誤。這將停止Observable,它在這之后不會(huì)再調(diào)用onNext
或onCompleted
。onError
方法的參數(shù)是導(dǎo)致這個(gè)錯(cuò)誤的原因的一個(gè)表示(有時(shí)可能是一個(gè)Exception或Throwable對(duì)象,其它時(shí)候也可能是一個(gè)簡(jiǎn)單的字符串,取決于具體的實(shí)現(xiàn))。
onCompleted
如果沒有遇到任何錯(cuò)誤,Observable在最后一次調(diào)用onCompleted
之后會(huì)調(diào)用這個(gè)方法。
如果一個(gè)Observable直到有一個(gè)觀察者訂閱它才開始發(fā)射數(shù)據(jù)項(xiàng),就稱之為"冷"的Observable;如果一個(gè)Observable可能在任何時(shí)刻開始發(fā)射數(shù)據(jù),就稱之為"熱"的Observable,一個(gè)訂閱者可能從開始之后的某個(gè)時(shí)刻開始觀察它發(fā)射的數(shù)據(jù)序列,它可能會(huì)錯(cuò)過在訂閱之前發(fā)射的數(shù)據(jù)。
RxJava中的實(shí)現(xiàn)是subscribe
方法。
如果你使用無參數(shù)的版本,它將觸發(fā)對(duì)Observable的一個(gè)訂閱,但是將忽略它的發(fā)射物和通知。這個(gè)操作會(huì)激活一個(gè)"冷"的Observable。
你也可以傳遞一到三個(gè)函數(shù)給它,它們會(huì)按下面的方法解釋:
onNext
onNext
和onError
onNext
, onError
和onCompleted
最后,你還可以傳遞一個(gè)Observer
或Subscriber
接口給它,Observer
接口包含這三個(gè)以on
開頭的方法。Subscriber
接口也實(shí)現(xiàn)了這三個(gè)方法,而且還添加了幾個(gè)額外的方法,用于支持使用反壓操作(reactive pull backpressure
),這讓Subscriber
可以在Observable完成前取消訂閱。
subscribe
方法返回一個(gè)實(shí)現(xiàn)了Subscription
接口的對(duì)象。這個(gè)接口包含unsubscribe
方法,任何時(shí)刻你都可以調(diào)用它來斷開subscribe
方法建立的Observable和觀察者之間的訂閱關(guān)系。
forEach
方法是簡(jiǎn)化版的subscribe
,你同樣可以傳遞一到三個(gè)函數(shù)給它,解釋和傳遞給subscribe
時(shí)一樣。
不同的是,你無法使用forEach
返回的對(duì)象取消訂閱。也沒辦法傳遞一個(gè)可以用于取消訂閱的參數(shù)。因此,只有當(dāng)你明確地需要操作Observable的所有發(fā)射物和通知時(shí),你才應(yīng)該使用這個(gè)操作符。
BlockingObservable
類中也有一個(gè)類似的叫作forEach
的方法。詳細(xì)的說明見 BlockingObservable