中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解析反應式編程 RxJava 設計原理

發布時間:2021-12-03 09:09:11 來源:億速云 閱讀:189 作者:柒染 欄目:互聯網科技

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

一、ReactiveX 與 RxJava

ReactiveX 的全稱為Reactive Extension,一般縮寫為 Rx,即我們平常所說的反應式編程。其設計原理主要使用了觀察者模式,區分數據的生產者和消費者,通過事件流的方式進行數據的異步處理。

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

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

二、RxJava中的概念

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

從圖中我們可以看出:

  • Observable實現了ObservableSource接口,從字面意思就可以理解,這是一個提供觀察能力的接口,所以Observable的一大能力是供觀察者進行事件訂閱,而進行事件訂閱的方法實現就是調用Observable的subscribe()方法

  • Observable是一個抽象類,它提供了subscribeActual模板方法供子類實現,從源碼中可以看出,Observable的subscribe()方法最終會委托子類的subscribeActual()方法實現,這個方法會建立生產者與消費者之間的關聯關系。

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

Observable的存在讓生產者和消費者完全的解耦了,生產者只需關注自己生成何種Observable對象,而消費者也只需關注自己觀察的是哪種Observable。

在實際的應用中,Rxjava已經提供了各種各樣的操作符供我們使用,生產者只需要調用Observable中相應的方法即可以生成所需的可觀察對象,供消費者進行事件訂閱。消費者只需調用可觀察對象的subscribe()方法即可與生產者建立觀察關系,極其方便。

四、 真實的觀察

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

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

如何解析反應式編程 RxJava 設計原理

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

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

如何解析反應式編程 RxJava 設計原理

除去細枝末節,這三個方法都可以分成以下三步

  1. 創建被觀察者對象,并傳入觀察者observer,建立兩者的關聯關系;

  2. 觸發onSubscribe事件,觀察者響應該事件;

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

下圖是整個流程中的相關類圖。實際事件的發送者是FromArrayDisposable等對象,而實際的觀察者,則是一個實現了Observer接口的實體類。如果我們在subscribe時傳入的是一個lambda表達式,之后會被包裝成一個默認的LambdaObserver對象,進行事件消費。

如何解析反應式編程 RxJava 設計原理

五、 包裝的必要

RxJava中提供了豐富的操作符,比如flatMap,concatMap等可以對事件轉換,subscribeOn,observableOn等可以對生產和消費的線程進行控制。這些操作符實際上調用了Observable中的包裝方法對原有的可觀察對象進行包裝,返回了一個增強了的可觀察對象。

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

首先,flatMap操作會返回一個ObservableFlatMap對象,在創建這個對象時,會將原始的Observable對象作為構造函數的參數傳入。

查看其核心方法subscribeActual,

如何解析反應式編程 RxJava 設計原理

可以看到這一類對象的subscribeActual方法和上一節中的方法不太一樣,這里面并沒有去實際的創建觀察關系,而是做了兩件事:

  1. 對觀察者進行增強,將其包裝成為MergeObserver對象,由其對產生的時間進行響應。

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

如何解析反應式編程 RxJava 設計原理

Observable是支持鏈式操作的,就和Java 8中的Stream一樣,我們來考慮這樣一行代碼。

如何解析反應式編程 RxJava 設計原理

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

如何解析反應式編程 RxJava 設計原理

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泾川县| 诏安县| 江都市| 泽库县| 林周县| 谷城县| 兴和县| 宁晋县| 沅江市| 古浪县| 阜阳市| 富平县| 东台市| 中方县| 和静县| 莲花县| 邵阳市| 石嘴山市| 灵寿县| 四平市| 泗水县| 周口市| 泾阳县| 察雅县| 盐津县| 北碚区| 德兴市| 吉水县| 忻城县| 汉川市| 长海县| 佛坪县| 武胜县| 丰县| 塔城市| 华池县| 惠州市| 肇源县| 泸州市| 平乡县| 鹤峰县|