最近在研究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è)方法:
- onStart():它是在subscribe()發(fā)生后,事件發(fā)生前調(diào)用的,用來(lái)做一些準(zhǔn)備工作
- 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)行交流。