RxJava之旅(1):RxJava思想基礎(chǔ)

0. 前言

這兩年來(lái)RxJava越來(lái)越流行伤溉,但是在對(duì)RxJava的態(tài)度上呈現(xiàn)兩極分化的趨勢(shì)般码,一部分人非常喜歡RxJava,覺(jué)得非常好用乱顾;也有很多人覺(jué)得RxJava很難用板祝。在我最初學(xué)習(xí)RxJava的時(shí)候?qū)儆诤笳撸谖覀€(gè)人看來(lái)走净,其原因是RxJava的入門曲線比較高券时,在度過(guò)了最初的學(xué)習(xí)階段以后才能真正體會(huì)到RxJava的好處孤里。
因此,我決定寫下這個(gè)系列文章橘洞,把RxJava的基礎(chǔ)到進(jìn)階的內(nèi)容進(jìn)行講解捌袜,如果能夠幫助到和我一樣在入門階段感到困惑的人,我將感到非常榮幸炸枣。
本系列文章將會(huì)從基礎(chǔ)入門開始介紹虏等,其目的是盡快讓讀者掌握RxJava的基本使用,后續(xù)的文章將會(huì)對(duì)RxJava的特性進(jìn)行逐漸深入的介紹适肠。但是本系列文章不會(huì)提供任何可以直接在實(shí)際開發(fā)中復(fù)制使用的樣例代碼霍衫,其側(cè)重點(diǎn)更多的是對(duì)RxJava的理解,我相信對(duì)于真正要學(xué)習(xí)技術(shù)的人來(lái)說(shuō)侯养,從文章里復(fù)制代碼直接使用只是快速應(yīng)付工作而已敦跌,并不能對(duì)該技術(shù)有任何真正的了解。
本人在學(xué)習(xí)RxJava時(shí)逛揩,主要通過(guò)扔物線柠傍,大頭鬼等大牛的文章以及RxJava的源代碼。以下是基礎(chǔ)入門時(shí)所閱讀的文章地址辩稽,希望能夠?qū)Ω魑挥兴鶐椭?br> 《給Android開發(fā)者的RxJava詳解》 by:扔物線
《深入淺出RxJava》 by:大頭鬼
《謎之RxJava》 by:Gemini

1. 什么是RxJava

在Github官方項(xiàng)目上對(duì)ReactiveX的介紹原文如下:

Reactive Extensions for Async Programming

也就是說(shuō)惧笛,ReactiveX是異步編程的響應(yīng)式擴(kuò)展。
而RxJava的介紹如下:

RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.

也就是說(shuō)搂誉,RxJava是在Java上的響應(yīng)式擴(kuò)展,通過(guò)使用可觀察序列静檬,用于組成異步和基于事件編程的類庫(kù)炭懊。
官方的介紹過(guò)于正式和全面,非常不易于初學(xué)者的理解拂檩。從易于理解的角度來(lái)說(shuō)侮腹,RxJava是使用Java語(yǔ)言,以響應(yīng)式編程思維來(lái)進(jìn)行編程的Java類庫(kù)稻励。

2. 響應(yīng)式編程思維

2.1 學(xué)習(xí)技術(shù)的關(guān)鍵

我個(gè)人始終認(rèn)為父阻,掌握一項(xiàng)技術(shù)的關(guān)鍵是理解該技術(shù)的思想,而不是技術(shù)細(xì)節(jié)望抽。能否理解思想是“會(huì)不會(huì)”的問(wèn)題加矛,對(duì)技術(shù)細(xì)節(jié)的熟悉程是“好不好”的問(wèn)題。對(duì)于初學(xué)者來(lái)說(shuō)其實(shí)不存在“好不好”的問(wèn)題煤篙,因?yàn)橥耆粫?huì)這一門技術(shù)的情況下根本談不到對(duì)技術(shù)運(yùn)用的嫻熟度斟览。
在大學(xué)剛開始學(xué)習(xí)編程語(yǔ)言時(shí),很多人感到非常痛苦辑奈,原因就在于過(guò)于關(guān)注語(yǔ)法和函數(shù)運(yùn)用而忽略了該編程語(yǔ)言背后的編程思維/思想苛茂。例如已烤,學(xué)習(xí)C語(yǔ)言時(shí),重點(diǎn)應(yīng)該是面向過(guò)程編程和結(jié)構(gòu)化程序設(shè)計(jì)(忽略goto語(yǔ)句)妓羊;在C++的學(xué)習(xí)中胯究,重點(diǎn)應(yīng)該是面向?qū)ο蟮木幊趟枷搿T诶斫饩幊趟枷氲幕A(chǔ)之上躁绸,才能真正理解該編程語(yǔ)言的特性裕循,如C++中的繼承,多態(tài)等等涨颜。

2.2 面向過(guò)程與面向?qū)ο蠛?jiǎn)介

讓我們首先回顧一下面向?qū)ο蠛兔嫦蜻^(guò)程思想费韭。編程思想決定了編程語(yǔ)言的編程方式,而編程思想的不同是建模角度的不同庭瑰,說(shuō)通俗一些就是對(duì)世界萬(wàn)物理解方式的不同星持。
我們都知道,計(jì)算機(jī)編程在現(xiàn)實(shí)生活中的運(yùn)用是通過(guò)對(duì)具體問(wèn)題的關(guān)鍵特性進(jìn)行抽象(建模)弹灭,從而利用計(jì)算機(jī)進(jìn)行解決督暂。在面向過(guò)程的思想下,一切皆過(guò)程穷吮,所有的問(wèn)題都通過(guò)對(duì)事件過(guò)程進(jìn)行抽象去解決逻翁。而在面向?qū)ο缶幊讨校?em>一切皆對(duì)象,世界萬(wàn)物都是一個(gè)個(gè)單獨(dú)離散的個(gè)體(對(duì)象)捡鱼,所有的動(dòng)作行為都是個(gè)體間的交互八回。

注:之所以如此繁瑣的重復(fù)面向?qū)ο蠛兔嫦蜻^(guò)程的大概內(nèi)容,是為了能夠和響應(yīng)式編程進(jìn)行類比驾诈,從而盡快理解響應(yīng)式編程的概念缠诅。

2.3 響應(yīng)式編程簡(jiǎn)介

響應(yīng)式編程是面向數(shù)據(jù)流的編程思想,在響應(yīng)式編程思想下乍迄,一切皆數(shù)據(jù)流管引。響應(yīng)式編程所側(cè)重的是數(shù)據(jù)流的流動(dòng)。
為了更好的理解響應(yīng)式編程思維闯两,這里舉一個(gè)網(wǎng)絡(luò)請(qǐng)求的例子褥伴,在不同的編程思想下其解決方式是不同的。

  1. 在面向過(guò)程的編程思想下漾狼,我們所關(guān)注的是過(guò)程步驟的次序重慢。在該例中,我們所關(guān)注的是網(wǎng)絡(luò)請(qǐng)求的過(guò)程:發(fā)起請(qǐng)求->接收請(qǐng)求->處理請(qǐng)求逊躁。
  2. 在面向?qū)ο蟮木幊趟枷胂律嗣覀兯P(guān)注的是對(duì)象建模和對(duì)象間的交互,如構(gòu)建請(qǐng)求網(wǎng)絡(luò)的類對(duì)象,該類對(duì)象的構(gòu)造方法屯援、成員變量以及這個(gè)網(wǎng)絡(luò)請(qǐng)求類對(duì)象所需要的成員方法等等猛们。
  3. 在響應(yīng)式編程的思想下,我們所關(guān)心的是數(shù)據(jù)流的流動(dòng)狞洋。如網(wǎng)絡(luò)請(qǐng)求這一數(shù)據(jù)流發(fā)起后弯淘,數(shù)據(jù)流流向服務(wù)器接口,經(jīng)過(guò)服務(wù)器接口處理后流出返回的數(shù)據(jù)流吉懊,返回的數(shù)據(jù)流再經(jīng)過(guò)若干步的處理庐橙,最后流出結(jié)果為我們所需要的數(shù)據(jù)流。

所以借嗽,學(xué)習(xí)RxJava首先要了解什么是響應(yīng)式編程态鳖,而理解響應(yīng)式編程首先要養(yǎng)成一切皆數(shù)據(jù)流的編程思維。

限于篇幅和限于個(gè)人能力恶导,這里對(duì)面向過(guò)程浆竭、面向?qū)ο蟮母拍罱榻B是不完整和不嚴(yán)謹(jǐn)?shù)模ɡ纾嫦驅(qū)ο蠛兔嫦蜻^(guò)程并不是完全獨(dú)立的兩種編程思想惨寿,完整地介紹類似的概念過(guò)于龐大)邦泄,但這并不會(huì)影響到對(duì)RxJava的理解。

2.4 響應(yīng)式編程與RxJava

2.3節(jié)對(duì)響應(yīng)式編程進(jìn)行了簡(jiǎn)單的介紹裂垦,重點(diǎn)突出了一切皆數(shù)據(jù)流的編程思維方式顺囊,但是這還不能完全理解官方github上對(duì)RP(React Programming)和RxJava的定義,因此需要進(jìn)行補(bǔ)充蕉拢。

2.4.1 ReactiveX補(bǔ)充(異步編程)

再來(lái)回顧一下上文所引用的ReactiveX定義:

Reactive Extensions for Async Programming

ReactiveX是對(duì)異步編程的響應(yīng)式擴(kuò)展特碳,在2.3我們簡(jiǎn)單介紹了響應(yīng)式編程,而這一小節(jié)重點(diǎn)突出的是晕换,ReactiveX不僅僅是響應(yīng)式編程午乓,還是支持異步編程的。

2.4.2 RxJava補(bǔ)充(觀察者模式)

回顧一下RxJava的定義:

Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.

這里需要突出的是可觀察序列(observable sequences)和基于事件(event-based)届巩。

基礎(chǔ)事件的概念不需要多述硅瞧,如果是剛剛學(xué)習(xí)編程的讀者可以通過(guò)私信和評(píng)論單獨(dú)詢問(wèn)份乒。

讓我們?cè)賮?lái)看一下官方的詳細(xì)介紹:

It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.

大意如下:

RxJava擴(kuò)展了觀察者模式恕汇,以支持?jǐn)?shù)據(jù)/事件序列,并且添加了操作符或辖,允許你組成序列瘾英,而不用過(guò)于關(guān)心線程和同步異步的問(wèn)題。

之所以只翻譯了大意颂暇,是因?yàn)檫@里要突出的重點(diǎn)是觀察者模式(Observer Pattern)缺谴,其他內(nèi)容會(huì)在后面的文章中介紹。
觀察者模式是軟件設(shè)計(jì)模式中的一種耳鸯,在軟件開發(fā)中被大量運(yùn)用湿蛔。觀察者(Observer)對(duì)被觀察者(Observable)發(fā)出的事件進(jìn)行響應(yīng)處理膀曾。觀察者將自己注冊(cè)到被觀察者中,當(dāng)被觀察者發(fā)生變化時(shí)會(huì)通知觀察者阳啥,從而觀察者對(duì)這次變化響應(yīng)添谊,進(jìn)行處理。
相信大部分人對(duì)于觀察者模式都有一定的了解察迟,如果不清楚相關(guān)概念請(qǐng)參考軟件設(shè)計(jì)模式相關(guān)的書籍和資料斩狱,或者通過(guò)私信和評(píng)論等方式私下詢問(wèn),這里不再贅述扎瓶。
觀察者模式的類圖如下所示:

觀察者設(shè)計(jì)模式類圖

在RxJava中所踊,根據(jù)響應(yīng)式編程的概念,被觀察者實(shí)際上是數(shù)據(jù)流概荷,數(shù)據(jù)流的流動(dòng)其實(shí)就是觀察者對(duì)被觀察者變化的響應(yīng)秕岛,這一點(diǎn)對(duì)于后面的學(xué)習(xí)非常關(guān)鍵。

3. 總結(jié)與預(yù)告

這一篇文章并沒(méi)有涉及到任何的代碼細(xì)節(jié)和RxJava的技術(shù)細(xì)節(jié)乍赫,僅僅介紹了RxJava相關(guān)的思想基礎(chǔ)瓣蛀。但是這些思想基礎(chǔ)非常關(guān)鍵,只有在理解這些思想的前提下雷厂,才能夠更容易理解RxJava的具體內(nèi)容惋增。
下一篇文章將會(huì)開始介紹RxJava的入門內(nèi)容,我會(huì)盡快寫好發(fā)布出來(lái)改鲫。在閱讀文章的過(guò)程中诈皿,如果有任何不妥和疑惑以及沒(méi)有介紹清楚的地方歡迎指出交流,謝謝閱讀像棘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稽亏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缕题,更是在濱河造成了極大的恐慌截歉,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烟零,死亡現(xiàn)場(chǎng)離奇詭異瘪松,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锨阿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門宵睦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人墅诡,你說(shuō)我怎么就攤上這事壳嚎。” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵烟馅,是天一觀的道長(zhǎng)说庭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)郑趁,這世上最難降的妖魔是什么口渔? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮穿撮,結(jié)果婚禮上缺脉,老公的妹妹穿的比我還像新娘。我一直安慰自己悦穿,他們只是感情好攻礼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栗柒,像睡著了一般礁扮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞬沦,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天太伊,我揣著相機(jī)與錄音,去河邊找鬼逛钻。 笑死僚焦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的曙痘。 我是一名探鬼主播芳悲,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼边坤!你這毒婦竟也來(lái)了名扛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茧痒,失蹤者是張志新(化名)和其女友劉穎肮韧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旺订,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弄企,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耸峭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桩蓉。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淋纲,死狀恐怖劳闹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤本涕,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布业汰,位于F島的核電站,受9級(jí)特大地震影響菩颖,放射性物質(zhì)發(fā)生泄漏样漆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一晦闰、第九天 我趴在偏房一處隱蔽的房頂上張望放祟。 院中可真熱鬧,春花似錦呻右、人聲如沸跪妥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眉撵。三九已至,卻和暖如春落塑,著一層夾襖步出監(jiān)牢的瞬間纽疟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工憾赁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留污朽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓龙考,卻偏偏與公主長(zhǎng)得像膘壶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洲愤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容