響應(yīng)式編程開源庫(kù) RxJava2——起源

1.RxJava來源

從github上我們可以看到RxJava是隸屬于ReactiveX(Rx)倉(cāng)庫(kù)茎芭,Rx是從微軟的函數(shù)響應(yīng)式編程庫(kù)(Reactive Extensions)發(fā)展而來的, 提供了一種新的組織和協(xié)調(diào)異步事件的方式。
官方對(duì)于該庫(kù)的介紹是盒卸,

  1. An API for asynchronous programming with observable streams
  2. ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming
    ReactiveX提供可觀測(cè)流的異步編程API骗爆,它的靈感來源于觀察者模式、迭代器模式和函數(shù)編程這些優(yōu)秀思想蔽介。
    ReactiveX作為一個(gè)通用庫(kù), 現(xiàn)在已經(jīng)有多種語言的實(shí)現(xiàn)版本(都是開源的), 包含RxJava, RxCpp, RxSwift, RxKotlin, RxGroovy, RxJavaScript等具體可參照所有支持語言

2.什么是RxJava

RxJava 是 ReactiveX 在 Java 上的開源的實(shí)現(xiàn)摘投。
網(wǎng)上大多概況為它是一個(gè)實(shí)現(xiàn)了異步操作的庫(kù)。這種概括來源于官方但是太過片面虹蓄,它不僅僅異步一個(gè)功能犀呼,在使用中發(fā)現(xiàn)它對(duì)于數(shù)據(jù)流的各種處理非常方便。

下面是Github上RxJava庫(kù)的官方簡(jiǎn)介薇组。

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

RXJava——JVM的響應(yīng)性擴(kuò)展——在Java VM上使用可觀察序列(即ReactiveX中提到的可觀測(cè)流)編寫異步和基于事件的程序的庫(kù)外臂。
簡(jiǎn)而言之,就是在使用Java編程時(shí)律胀,該庫(kù)能使用觀察者模式編寫異步和基于事件的程序宋光。

3.關(guān)鍵詞解析

既然是學(xué)習(xí)就要搞清楚細(xì)節(jié),所以對(duì)于這些平時(shí)聽到的名詞炭菌,還是值得我們基于極客和刨根問底的精神來細(xì)細(xì)品味的罪佳。

觀察者模式

觀察者模式(有時(shí)又被稱為模型(Model)-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟件設(shè)計(jì)模式的一種黑低。在此種模式中赘艳,一個(gè)目標(biāo)物件管理所有相依于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知克握。這通常透過呼叫各觀察者所提供的方法來實(shí)現(xiàn)蕾管。此種模式通常被用來實(shí)現(xiàn)事件處理系統(tǒng)。

迭代器模式

提供一種方法順序訪問一個(gè)聚合對(duì)象中各個(gè)元素菩暗,而又不需暴露該對(duì)象的內(nèi)部表示掰曾。比如Java中的LinkedList內(nèi)部實(shí)現(xiàn)是雙向鏈表,比較復(fù)雜停团,這時(shí)候通過迭代器Iterator遍歷元素就很簡(jiǎn)單旷坦,我們不必關(guān)注內(nèi)部實(shí)現(xiàn)。

函數(shù)式編程

函數(shù)式編程是種編程方式客蹋,它將電腦運(yùn)算視為函數(shù)的計(jì)算。函數(shù)編程語言最重要的基礎(chǔ)是λ演算(lambda calculus)孽江,而且λ演算的函數(shù)可以接受函數(shù)當(dāng)作輸入(參數(shù))和輸出(返回值)讶坯。
函數(shù)式編程中的函數(shù),是指數(shù)學(xué)中的函數(shù)岗屏,即自變量的映射(一種東西和另一種東西之間的對(duì)應(yīng)關(guān)系)辆琅。也就是說漱办,一個(gè)函數(shù)的值僅決定于函數(shù)參數(shù)的值,不依賴其他狀態(tài)婉烟。

響應(yīng)式編程

簡(jiǎn)稱RP(Reactive Programming)
在計(jì)算機(jī)領(lǐng)域娩井,響應(yīng)式編程是一個(gè)專注于數(shù)據(jù)流和變化傳遞的異步編程范式。這意味著可以使用編程語言很容易地表示靜態(tài)(例如數(shù)組)或動(dòng)態(tài)(例如事件發(fā)射器)數(shù)據(jù)流似袁,并且在關(guān)聯(lián)的執(zhí)行模型中洞辣,存在著可推斷的依賴關(guān)系,這個(gè)關(guān)系的存在有利于自動(dòng)傳播與數(shù)據(jù)流有關(guān)的更改昙衅。
簡(jiǎn)單概括扬霜,本質(zhì)上是程序會(huì)對(duì)數(shù)據(jù)流或某種變化所作出相應(yīng)的反應(yīng)。

4.從基本使用RxJava分析

掘金翻譯計(jì)劃中看到的有關(guān)RxJava的介紹講的很仔細(xì)而涉,解決了很多困惑著瓶。還是從最基本的使用入手,下面是最基本的最簡(jiǎn)單的用法啼县。

/****************創(chuàng)建被觀察者******************/
        Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                //執(zhí)行耗時(shí)操作
                Thread.sleep(2000);
                emitter.onNext("耗時(shí)操作完畢材原,發(fā)送可觀測(cè)的對(duì)象");
            }
        })
                /****************線程調(diào)度,被觀察者在IO線程季眷,觀察者在主線程訂閱******************/
                .observeOn(Schedulers.io())
                .subscribeOn(AndroidSchedulers.mainThread())


                /****************被觀察者被觀察者訂閱******************/
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(String s) {

                        Log(s);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

我們從類名就能大概簡(jiǎn)單理解到整個(gè)代碼的意思余蟹,創(chuàng)建一個(gè)被觀察者Observable,如果它被觀察者Observer訂閱了瘟裸,那么事件發(fā)射器ObservableEmitter就會(huì)將事件推到每個(gè)觀察者客叉。其中ObservableOnSubscribe在源碼中的解釋如下

/**
 * A functional interface that has a {@code subscribe()} method that receives
 * an instance of an {@link ObservableEmitter} instance that allows pushing
 * events in a cancellation-safe manner.
 *
 * @param <T> the value type pushed
 */
public interface ObservableOnSubscribe<T> {

    /**
     * Called for each Observer that subscribes.
     * @param emitter the safe emitter instance, never null
     * @throws Exception on error
     */
    void subscribe(@NonNull ObservableEmitter<T> emitter) throws Exception;
}

它是一個(gè)擁有 subscribe方法的功能性接口,能接收一個(gè) ObservableEmitter對(duì)象话告,該對(duì)象能安全的推送事件兼搏,并能以安全方式取消。
注意這里的 subscribe方法的描述沙郭,每個(gè)訂閱該事件的觀察者都會(huì)調(diào)用這個(gè)方法佛呻,擁有這個(gè)發(fā)射器。

舉個(gè)例子來說明病线,比如現(xiàn)在有很多學(xué)生訂閱21世紀(jì)英語報(bào)吓著,那么報(bào)社就相當(dāng)于被觀察者Observable,我們相當(dāng)于觀察者Observer送挑,送報(bào)人就相當(dāng)于這里的事件發(fā)射器ObservableEmitter绑莺。我們想要看報(bào)紙不需要去詢問報(bào)社什么時(shí)候有新的報(bào)紙,只需要訂閱惕耕,如果有新的報(bào)紙纺裁,送報(bào)人就會(huì)給我們送來新的報(bào)紙。

5.Observable類

下面就Observable這個(gè)類,結(jié)合ReactiveX中的關(guān)于Observable的解釋和RxJava中的文檔解釋來分析一下這個(gè)類欺缘。
ReactiveX中的介紹:在ReactiveX中栋豫,觀察者訂閱一個(gè)被觀察者。然后谚殊,觀察者可對(duì)可觀察到的項(xiàng)目或項(xiàng)目序列做出反應(yīng)丧鸯。這種模式有利于并發(fā)操作。因?yàn)樗粫?huì)在等待被觀察者發(fā)射對(duì)象時(shí)阻塞嫩絮,而是以觀察者的形式丛肢,隨時(shí)準(zhǔn)備對(duì)被觀察者在未來的任何時(shí)間做出適當(dāng)?shù)姆磻?yīng)稚铣。
下面這種圖表示了在ReactiveX文檔中被觀察者是如何轉(zhuǎn)換的耀销,文檔中會(huì)多次出現(xiàn)這樣類似的圖育拨,對(duì)于我們理解很有幫助夸研。

RxJava中的介紹:Observable是非背壓的搞糕,它是一個(gè)提供工廠方法慧邮、中間操作符來同步或異步的處理數(shù)據(jù)流的基類所刀。該類中的許多運(yùn)算符接受ObservableSource(s)仰泻,這是非背壓流的基本接口撰洗,Observable本身也實(shí)現(xiàn)了這種接口篮愉。ObservableSource是可被觀察者處理的非背壓被觀察者源基本接口。它里面的subscribe方法是為了將觀察者和被觀察者聯(lián)系起來差导,也就是產(chǎn)生訂閱關(guān)系试躏。

/**
 * Represents a basic, non-backpressured {@link Observable} source base interface,
 * consumable via an {@link Observer}.
 *
 * @param <T> the element type
 * @since 2.0
 */
public interface ObservableSource<T> {

    /**
     * Subscribes the given Observer to this ObservableSource instance.
     * @param observer the Observer, not null
     * @throws NullPointerException if {@code observer} is null
     */
    void subscribe(@NonNull Observer<? super T> observer);
}

6.各方法作用

create方法在上面提到過就是創(chuàng)建被觀察者,調(diào)用ObservableEmitter發(fā)射器的方法如下圖设褐,onNext會(huì)以推的方式發(fā)送數(shù)據(jù)颠蕴,onComplete表示已經(jīng)完成。


observeOn方法就是對(duì)被觀察者進(jìn)行線程調(diào)度助析,讓它在指定的線程發(fā)送犀被。這里要注意的是,如果調(diào)度器真的是異步外冀,那么在發(fā)送的線程中onError可能先于onNext執(zhí)行寡键,如果需要嚴(yán)格的事件順序,請(qǐng)考慮使用 observeOn(Scheduler scheduler, boolean delayError)重載雪隧。


subscribeOn在指定線程異步訂閱被觀察者西轩。訂閱過程是異步的,結(jié)果是在指定線程接收脑沿。


Observer就是觀察者基類接口藕畔,其中的方法和發(fā)射器基類接口的方法基本一致,所以發(fā)送的數(shù)據(jù)會(huì)在onNext中接收到庄拇,onError注服、onComplete同理,唯一多了的方法就是onSubscribe它會(huì)接收一個(gè)Disposable對(duì)象,以便隨時(shí)打斷被觀察者和觀察者之間的聯(lián)系祠汇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市熄诡,隨后出現(xiàn)的幾起案子可很,更是在濱河造成了極大的恐慌,老刑警劉巖凰浮,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件我抠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袜茧,警方通過查閱死者的電腦和手機(jī)菜拓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笛厦,“玉大人纳鼎,你說我怎么就攤上這事∩淹梗” “怎么了贱鄙?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姨谷。 經(jīng)常有香客問我逗宁,道長(zhǎng),這世上最難降的妖魔是什么梦湘? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任瞎颗,我火速辦了婚禮,結(jié)果婚禮上捌议,老公的妹妹穿的比我還像新娘哼拔。我一直安慰自己,他們只是感情好禁灼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布管挟。 她就那樣靜靜地躺著,像睡著了一般弄捕。 火紅的嫁衣襯著肌膚如雪僻孝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天守谓,我揣著相機(jī)與錄音穿铆,去河邊找鬼。 笑死斋荞,一個(gè)胖子當(dāng)著我的面吹牛荞雏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凤优,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悦陋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筑辨,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤俺驶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后棍辕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暮现,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年楚昭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栖袋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抚太,死狀恐怖塘幅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尿贫,我是刑警寧澤晌块,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站帅霜,受9級(jí)特大地震影響匆背,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜身冀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一钝尸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搂根,春花似錦珍促、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仁卷,卻和暖如春穴翩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锦积。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工芒帕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丰介。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓背蟆,卻偏偏與公主長(zhǎng)得像鉴分,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子带膀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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