如何解析反應(yīng)式編程RxJava設(shè)計原理

這篇文章給大家介紹如何解析反應(yīng)式編程 RxJava 設(shè)計原理,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

創(chuàng)新互聯(lián)長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為獲嘉企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè),獲嘉網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

一、ReactiveX 與 RxJava

ReactiveX 的全稱為Reactive Extension,一般縮寫為 Rx,即我們平常所說的反應(yīng)式編程。其設(shè)計原理主要使用了觀察者模式,區(qū)分?jǐn)?shù)據(jù)的生產(chǎn)者和消費(fèi)者,通過事件流的方式進(jìn)行數(shù)據(jù)的異步處理。

RxJava 是 ReactiveX Java語言的實(shí)現(xiàn),其編程體驗與Java 8中的函數(shù)式編程和流(Stream)有很大的相似之處,在掌握了Java8的相關(guān)知識后,你可以很輕松的就上手使用 RxJava。

本篇文章主要聚焦對RxJava中幾種主要的設(shè)計模式的理解,通過梳理Observable的相關(guān)類圖以及講解這些類之間的關(guān)系,讓大家能夠更清晰的理解RxJava中事件驅(qū)動的工作原理。

二、RxJava中的概念

首先我們寫一個簡單的RxJava的程序,把數(shù)組中的元素作為事件發(fā)送,最終由消費(fèi)者打印在控制臺:

從圖中我們可以看出:

  • Observable實(shí)現(xiàn)了ObservableSource接口,從字面意思就可以理解,這是一個提供觀察能力的接口,所以O(shè)bservable的一大能力是供觀察者進(jìn)行事件訂閱,而進(jìn)行事件訂閱的方法實(shí)現(xiàn)就是調(diào)用Observable的subscribe()方法

  • Observable是一個抽象類,它提供了subscribeActual模板方法供子類實(shí)現(xiàn),從源碼中可以看出,Observable的subscribe()方法最終會委托子類的subscribeActual()方法實(shí)現(xiàn),這個方法會建立生產(chǎn)者與消費(fèi)者之間的關(guān)聯(lián)關(guān)系。

  • 除此之外,Observable還是一個工廠類,它提供了靜態(tài)方法fromArray()、create()等用來創(chuàng)建具體的可觀察對象,同時還提供了flatMap()、concatMap()等操作方法對可觀察對象進(jìn)行包裝。

Observable的存在讓生產(chǎn)者和消費(fèi)者完全的解耦了,生產(chǎn)者只需關(guān)注自己生成何種Observable對象,而消費(fèi)者也只需關(guān)注自己觀察的是哪種Observable。

在實(shí)際的應(yīng)用中,Rxjava已經(jīng)提供了各種各樣的操作符供我們使用,生產(chǎn)者只需要調(diào)用Observable中相應(yīng)的方法即可以生成所需的可觀察對象,供消費(fèi)者進(jìn)行事件訂閱。消費(fèi)者只需調(diào)用可觀察對象的subscribe()方法即可與生產(chǎn)者建立觀察關(guān)系,極其方便。

四、 真實(shí)的觀察

觀察者模式是RxJava設(shè)計的核心思想,在觀察者模式中總是存在觀察的對象和被觀察的對象,從上文的解析中也可以看出Observable更多的是一個控制器的作用,而并非真正的事件的來源。那么在RxJava中,什么才是真正的生產(chǎn)者,什么才是真正的消費(fèi)者呢。

我們來分析下以下三種常見的Observable:

如何解析反應(yīng)式編程 RxJava 設(shè)計原理

先簡單介紹下這幾個Observable的作用,fromArray的作用是將數(shù)組中的元素作為onNext事件發(fā)送,create的作用是發(fā)送自定義事件,just的作用是發(fā)送單個事件。

上一小節(jié)有講到實(shí)際的訂閱行為是由各個Observable類中subscribeActual()方法實(shí)現(xiàn)的,我們來看下這三個類的subscribeActual()方法。

如何解析反應(yīng)式編程 RxJava 設(shè)計原理

除去細(xì)枝末節(jié),這三個方法都可以分成以下三步

  1. 創(chuàng)建被觀察者對象,并傳入觀察者observer,建立兩者的關(guān)聯(lián)關(guān)系;

  2. 觸發(fā)onSubscribe事件,觀察者響應(yīng)該事件;

  3. 進(jìn)行事件的拉取,我們可以進(jìn)入到d.run(),source.subscribe(parent),sd.run()這些方法的內(nèi)部看一些,可以看到這些方法就是在發(fā)送onNext(),onError(),onComplete()等事件。

下圖是整個流程中的相關(guān)類圖。實(shí)際事件的發(fā)送者是FromArrayDisposable等對象,而實(shí)際的觀察者,則是一個實(shí)現(xiàn)了Observer接口的實(shí)體類。如果我們在subscribe時傳入的是一個lambda表達(dá)式,之后會被包裝成一個默認(rèn)的LambdaObserver對象,進(jìn)行事件消費(fèi)。

如何解析反應(yīng)式編程 RxJava 設(shè)計原理

五、 包裝的必要

RxJava中提供了豐富的操作符,比如flatMap,concatMap等可以對事件轉(zhuǎn)換,subscribeOn,observableOn等可以對生產(chǎn)和消費(fèi)的線程進(jìn)行控制。這些操作符實(shí)際上調(diào)用了Observable中的包裝方法對原有的可觀察對象進(jìn)行包裝,返回了一個增強(qiáng)了的可觀察對象。

操作符種類繁多,在這就不一一舉例,我們以flatMap為例,分析一下這些操作符是如何工作的。

首先,flatMap操作會返回一個ObservableFlatMap對象,在創(chuàng)建這個對象時,會將原始的Observable對象作為構(gòu)造函數(shù)的參數(shù)傳入。

查看其核心方法subscribeActual,

如何解析反應(yīng)式編程 RxJava 設(shè)計原理

可以看到這一類對象的subscribeActual方法和上一節(jié)中的方法不太一樣,這里面并沒有去實(shí)際的創(chuàng)建觀察關(guān)系,而是做了兩件事:

  1. 對觀察者進(jìn)行增強(qiáng),將其包裝成為MergeObserver對象,由其對產(chǎn)生的時間進(jìn)行響應(yīng)。

  2. 再調(diào)用source的subscribe方法,這里source就是前面構(gòu)造函數(shù)中傳入的Observable對象,由其再進(jìn)行觀察關(guān)系的建立。
    下圖是RxJava中裝飾器模式的相關(guān)類圖:所有的包裝類都繼承了AbstractObservableWithUpstream類,該抽象類有一個類型為ObservableSource的成員函數(shù),用來持有被裝飾的對象。

如何解析反應(yīng)式編程 RxJava 設(shè)計原理

Observable是支持鏈?zhǔn)讲僮鞯模秃蚃ava 8中的Stream一樣,我們來考慮這樣一行代碼。

如何解析反應(yīng)式編程 RxJava 設(shè)計原理

我們在分析上面這串代碼時,一定會凌亂非常,在看源碼時也會看到前面忘掉后面,但是如果我們對RxJava的包裝流程足夠了解的話,就可以很輕松的對上述代碼進(jìn)行分析。

如何解析反應(yīng)式編程 RxJava 設(shè)計原理

RxJava的封裝足夠強(qiáng)大,可以讓我們很方便的進(jìn)行使用和擴(kuò)展,但這也給我們理解其真實(shí)的工作原理帶來了難度,如果我們對整個事件的處理過程處于一知半解的狀態(tài),那我們就無法從容的對服務(wù)進(jìn)行異步編排,在實(shí)際開發(fā)過程中也難以發(fā)現(xiàn)問題的根源。

關(guān)于如何解析反應(yīng)式編程 RxJava 設(shè)計原理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

當(dāng)前名稱:如何解析反應(yīng)式編程RxJava設(shè)計原理
網(wǎng)頁URL:http://muchs.cn/article22/jchccc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、網(wǎng)站維護(hù)、ChatGPT、網(wǎng)站制作網(wǎng)站導(dǎo)航、動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名