Rxjava 最本質(zhì)的概念還是觀察者模式 而觀察者模式是
定義了對象間一對多的依賴關(guān)系,使得當(dāng)對象狀態(tài)發(fā)生變化時,所有依賴它的對象都會收到通知并且自動更新自己。
觀察者模式 比較不錯的學(xué)習(xí)文章 可以看這個?http://www.lxweimin.com/p/d5a758dd2795? 初學(xué)者學(xué)習(xí)設(shè)計模式 很容易理解
RxJava 有四個基本概念:Observable(可觀察者,即被觀察者)、Observer(觀察者)、subscribe(訂閱)、事件。
Observable和Observer通過subscribe()方法實現(xiàn)訂閱關(guān)系,從而Observable可以在需要的時候發(fā)出事件來通知Observer。
這幾個單詞大家一定要記住是什么意思 我剛剛學(xué)習(xí)的時候 也是老是忘記 所以才寫下這篇文章 ?自己寫一遍 加深印象
根據(jù)觀察者的設(shè)計模式就很好的可以理解了 Observer(觀察者) subscribe(訂閱)Observable(可觀察者,即被觀察者)
說的很通俗一點了? 就是我觀察了你 你做什么事情我都知道你要干嘛 ? 而這個觀察就是通過subscribe(訂閱來實現(xiàn)的)
除了Observer接口之外,RxJava 還內(nèi)置了一個實現(xiàn)了Observer的抽象類:Subscriber。Subscriber對Observer接口進行了一些擴展,但他們的基本使用方式是完全一樣的:
不過 大家發(fā)現(xiàn) 代碼 都是 Observable(即被觀察者) subscribe (訂閱)Observer(觀察者)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Observable(即被觀察者) subscribe (訂閱)Subscriber(觀察者)
以上代碼意思都是一樣的 ?都是被觀察者訂閱了觀察者。 (看圖1.0.0)
不僅基本使用方式一樣,實質(zhì)上,在 RxJava 的 subscribe 過程中,Observer也總是會先被轉(zhuǎn)換成一個Subscriber再使用。所以如果你只想使用基本功能,選擇Observer和Subscriber是完全一樣的。它們的區(qū)別對于使用者來說主要有兩點:
onStart(): 這是Subscriber增加的方法。它會在 subscribe 剛開始,而事件還未發(fā)送之前被調(diào)用,可以用于做一些準(zhǔn)備工作,例如數(shù)據(jù)的清零或重置。這是一個可選方法,默認(rèn)情況下它的實現(xiàn)為空。需要注意的是,如果對準(zhǔn)備工作的線程有要求(例如彈出一個顯示進度的對話框,這必須在主線程執(zhí)行),onStart()就不適用了,因為它總是在 subscribe 所發(fā)生的線程被調(diào)用,而不能指定線程。要在指定的線程來做準(zhǔn)備工作,可以使用doOnSubscribe()方法,具體可以在后面的文中看到。
unsubscribe(): 這是Subscriber所實現(xiàn)的另一個接口Subscription的方法,用于取消訂閱。在這個方法被調(diào)用后,Subscriber將不再接收事件。一般在這個方法調(diào)用前,可以使用isUnsubscribed()先判斷一下狀態(tài)。unsubscribe()這個方法很重要,因為在subscribe()之后,Observable會持有Subscriber的引用,這個引用如果不能及時被釋放,將有內(nèi)存泄露的風(fēng)險。所以最好保持一個原則:要在不再使用的時候盡快在合適的地方(例如onPause()onStop()等方法中)調(diào)用unsubscribe()來解除引用關(guān)系,以避免內(nèi)存泄露的發(fā)生。
大家可以很明顯的看到了是被觀察者訂閱了觀察者 (以上代碼是基于Rxjava 2.1.0的版本)?
這個大家在邏輯上就有點接受不來了 就像 這看起來就像『雜志訂閱了讀者』一樣顛倒了對象關(guān)系 ?但是既然Rxjava是這樣的設(shè)計 大家也沒有必要非要糾結(jié)了
大家可以看到被觀察者的實現(xiàn) 模式 一般是 Observable.create();采取的是build的模式
而觀察者一般都是new ?比如這里 new ConSumer() 出來的對象 這點大家要稍微注意一點?
拋物線大佬增加說過:
RxJava 到底是什么
一個詞:異步。
?大家還是看代碼 ?圖1.0.0很好的實現(xiàn)了異步的操作?
在android 中異步的場景還是有很多的 最常見的就是從服務(wù)端獲取數(shù)據(jù) 通常呢 一般都是在后臺進行,而顯示數(shù)據(jù)呢 需要在主線程中進行(UI線程)所以 異步在android 中還是十分需要的。
那么RxJava 怎么實現(xiàn)異步呢?
subscribeOn(Schedulers.io());
observeOn(AndroidSchedulers.mainThread());
就是這么簡短的兩句話就實現(xiàn)了異步的過程 。
這里講一講它們之間的區(qū)別:
subscribeOn():指定Observable(被觀察者)自身在哪個調(diào)度器上執(zhí)行
observeOn() :指定一個觀察者在哪個調(diào)度器上觀察這個Observable(被觀察者)