Rxjava梳理(1)--Observable,Observer,subscribe

最近在研究Rxjava,也希望能自己的一些輸入梳理出來(lái),幫助自己形成一個(gè)體系吧。話說(shuō)自己第一次認(rèn)識(shí)Rxjava還是參加了一次Thoughtworks組織的一次分享上。當(dāng)時(shí)的第一印象就是Rxjava跟我們一般的寫程序的思路確實(shí)有些不同,需要花些時(shí)間消化。現(xiàn)在就開始梳理自己對(duì)Rxjava的理解。

不管學(xué)什么東西,第一步先要了解它的概念:“A library for composing asynchronous and event-based programs by using observable sequences.”這句話的意思是Rxjava是一個(gè)利用監(jiān)聽者模式構(gòu)成了異步的并且事件驅(qū)動(dòng)的程序。什么意思呢?先從監(jiān)聽者模式開始說(shuō)起吧。相信大家對(duì)監(jiān)聽者模式并不算陌生吧,當(dāng)對(duì)象A對(duì)對(duì)象B感興趣的話,會(huì)讓對(duì)象B注冊(cè)自己并告訴它:“我對(duì)你很感興趣,請(qǐng)你在XXX狀態(tài)改變的時(shí)候或者是引發(fā)XXX事件的時(shí)候通知我”。Android中最常見的一個(gè)例子就是View.setOnClickListener() 方法,對(duì)該視圖控件感興趣的對(duì)象會(huì)實(shí)現(xiàn)OnClickListener這個(gè)接口并要求該控件注冊(cè)自己。這樣只要這個(gè)空間有了點(diǎn)擊事件發(fā)生,這個(gè)對(duì)象用來(lái)監(jiān)聽的回調(diào)方法就會(huì)被調(diào)用。

Rxjava則是對(duì)觀察者模式的一個(gè)高度的抽象,它包括兩個(gè)非常重要的類:Observable(被觀察者)和Observer(觀察者),而這兩個(gè)類的對(duì)象之間是通過(guò)subscribe()方法來(lái)建立訂閱關(guān)系的連接。

先來(lái)看看Observer的的代碼:
<code>
public interface Observer<T>{
public void onNext(T t);
public void onCompleted();
public void onError(Throwable e);
}
</code>
其中onNext()方法類似onClick()方法用來(lái)供觀察者處理事件,而onCompleted()方法是被觀察者用來(lái)告訴觀察者:“我傳給你的事件已經(jīng)都傳完了,你可以做你的事情了”,onError()方法是被觀察者告訴觀察者:"我在給你傳事件的時(shí)候出錯(cuò)了,去看一看吧"。由此可以看出來(lái)一個(gè)Observer對(duì)象對(duì)一次訂閱只可能調(diào)用onCompleted()和onError()方法的其中一個(gè),而不可能兩個(gè)方法都調(diào)用。

下面來(lái)看看如果生成Observable對(duì)象吧。最原始的一個(gè)方法是Observable.create(OnSubscribe<T> onSubscribe),該方法中的參數(shù)OnSubscribe是一個(gè)接口,該接口的方法如下:
<code>
public void call(Subscriber<? super T> subscriber);
</code>
類Subscriber是Observer的子類,這樣就不難猜到觀察者里的調(diào)用邏輯就是在OnSubscribe里的call方法定義的。通過(guò)Observable.create()方法也就衍生出了一系列的更加方便的生成Observable對(duì)象的方法。比如Observable.just("1","2","3")方法就相當(dāng)于在OnSubscribe對(duì)象里的call方法是這樣實(shí)現(xiàn)的:
<code>
subscriber.next("1");
subscriber.next("2");
subscriber.next("3");
subscriber.onCompleted();
</code>

當(dāng)Observable對(duì)象和Observer對(duì)象都有了的時(shí)候就要靠subscribe()方法把兩者連接起來(lái):Observable.subscribe(Subscriber),可見subscribe方法的參數(shù)是Subscriber類,在該類中除了含有Observer接口的那幾個(gè)方法外還有兩個(gè)方法:

  1. onStart():它是在subscribe()發(fā)生后,事件發(fā)生前調(diào)用的,用來(lái)做一些準(zhǔn)備工作
  2. unsubscribe():它表示取消訂閱,也就是說(shuō)它調(diào)用后Subscriber對(duì)象不再接收傳過(guò)來(lái)的事件。當(dāng)然它還有一個(gè)更重要的作用就是釋放掉Observable的引用,以避免內(nèi)存泄漏的威脅。

以上就是關(guān)于Rxjava中最基本的一些概念的梳理,以后還會(huì)繼續(xù),現(xiàn)在關(guān)于Rxjava的教程文檔并不算多,所以我自己也在學(xué)習(xí)階段,希望能和更多的朋友進(jìn)行交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我從去年開始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,778評(píng)論 7 62
  • 前言我從去年開始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占導(dǎo)zqq閱讀 9,342評(píng)論 6 151
  • Github:https://github.com/ReactiveX/RxJavahttps://github....
    才兄說(shuō)閱讀 1,725評(píng)論 2 10
  • 曾經(jīng)看過(guò)這樣一則故事:唐太宗貞觀年間,在長(zhǎng)安城西的一家磨坊里,有一匹馬和一頭驢子,它們是好朋友。馬驢各司其職,馬負(fù)...
    易水漸寒閱讀 1,445評(píng)論 0 3
  • 你把悲傷唱成了一座孤島 燈塔是蒼涼的味道 暗黑的海水爬上干燥的嘴角 心臟被可恥的孤獨(dú)環(huán)繞 我想要看看你眼底的月亮 ...
    愛醬lll閱讀 349評(píng)論 0 2

友情鏈接更多精彩內(nèi)容