RxJava 一:RxJava X 簡單理解及基本概念

目錄

 

1. RxJava X

2. 觀察者模式

3. 函數響應式編程結構

3.1.響應式編程(Reactive Programming)

3.2.函數式編程(Functional programming)

3.3.函數響應式編程(Functional Reactive Programming:FRP):

4. 背壓(Backpressure)


1. RxJava X

Rx是ReactiveX的簡寫,後者是Reactive Extensions的縮寫,Rx是一種編程模型,用於方便處理異步數據流。

RxJava(Reactive Extensions for the JVM)

RxJava是響應式編程(Reactive Extensions)在Java VM上的實現,是一個在 Java VM 上使用可觀察序列來組成異步的基於事件的程序庫。

RxJava可以濃縮爲異步兩個字,核心內容Observable(被觀察者) 和 Observer(觀察者)。Observable可以發出一系列的事件(例如網絡請求、複雜計算、數據庫操作、文件讀取等),事件執行結束後交給Observer的回調處理。

異步

這裏主要就是兩個核心的方法subscribeOn和observeOn。這兩個方法都傳入一個Scheduler對象,subscribeOn指定產生事件的線程,observeOn指定消費事件的線程。

強大的操作符

提供了一系列的轉換操作符,可以將事件序列中的某個事件或整個事件序列進行加工處理,轉換成不同的事件或事件序列,然後再發送出去!

鏈式調用

鏈式調用最大的好處就是邏輯清晰,代碼簡潔!在應對較複雜的邏輯的時候,也能展現出清晰的思路!

簡潔

異步操作很關鍵的一點是程序的簡潔性,因爲在調度過程比較複雜的情況下,異步代碼經常會既難寫也難被讀懂。 Android 創造的AsyncTask 和Handler ,其實都是爲了讓異步代碼更加簡潔。RxJava 的優勢也是簡潔,但它的簡潔的與衆不同之處在於,隨着程序邏輯變得越來越複雜,它依然能夠保持簡潔

Githubhttps://github.com/ReactiveX/RxJava

               https://github.com/ReactiveX/RxAndroid

 

2. 觀察者模式

RxJava 有四個基本概念:Observable (可觀察者,被觀察者,生產者)、 Observer (觀察者,消費者)、 subscribe (訂閱)、事件Observable 和Observer 通過 subscribe() 方法實現訂閱關係,Observable 可以在需要的時候發出事件來通知 Observer,且RxJava支持事件以隊列的形式連續發送。

Rx最主要的目的是爲了更好地處理事件序列,這個很重要!RxJava提供了一整套強大的操作符,可以靈活變換、組合、操縱和處理事件數據流,同時始終保持簡潔。

RxJava 的事件

普通事件

onNext() 相當於 onClick() / onEvent()。

特殊事件

onComplete()事件隊列完結。RxJava 把多個事件看做一個隊列,並對每個事件單獨處理。RxJava 規定,當不會再有新的onNext() 發出時,需要觸發 onComplete() 方法作爲完結標誌。

onError()事件隊列異常。在事件處理過程中出異常時,onError() 會被觸發,同時隊列自動終止,且不允許再有事件發出。

在一個正確運行的事件序列中, onComplete() 和 onError() 有且只有一個,並且是事件序列中的最後一個。需要注意的是,onComplete() 和 onError() 二者也是互斥的,即在隊列中調用了其中一個,就不應該再調用另一個。

3. 函數響應式編程結構

3.1.響應式編程(Reactive Programming)

響應式編程是一種面向數據流和變化傳播的一種編程範式。是發送,流轉,監聽,響應數據流的一套編程範式。在流轉的過程中可以對數據流進行過濾,轉變,合併,去重等方式的處理。其中變化傳播在程序中也是轉換爲數據流的形式進行處理。

什麼是響應式編程? a = b + c; 這句代碼將b+c的值賦給a,而之後如果b和c的值改變了不會影響到a,然而,對於響應式編程,之後b和c的值的改變也動態影響着a,意味着a會隨着b和c的變化而變化。

響應式編程的終極思想,一切皆流(everything is stream)。根據唯物辯證法的思想,物質世界是普遍聯繫和不斷運動變化的統一整體,而一切‘運動變化’這一‘客觀現象’都可以通過數據流進行‘抽象描述’,也可以說,物質世界是數據流的客觀存在。

在程序中數據流是輕量而常見的,變量,數組,集合,對象,事件都可當做數據流來發送處理。

例如:

界面數據的展示:可以將要展示的數據由其數據源(網絡請求,數據庫查詢等)將其以數據流的形式進行發出,通過一系列的傳遞,轉變(後臺線程傳遞到UI線程,對數據進行條件過濾等),交給界面,界面在拿到數據後,做出相應的響應,將其展示出來。

用戶動作的交互:可以將一些用戶輸入事件(觸摸屏幕,點擊鼠標,敲擊鍵盤等),轉換爲約定的數據符號,將其以數據流的形式發送,通過層層傳遞,交給相應的窗口,窗口交給相應的控件,控件監聽到相應的事件後,響應用戶的行爲。

3.2.函數式編程(Functional programming)

函數式編程是一種通過函數或者函數的組合調用來處理數據,獲取結果的一種編程範式。

函數是函數式編程的核心,相當於對象在面向對象編程中的地位一樣。在函數式編程中,函數可以獨立地解決特定的問題,可以通過與其他函數的組合調用來解決複雜的問題,可以作爲另一個函數的參數,可以返回一個新的函數,也可以當做變量在函數之間或函數內部傳遞。

在函數式編程中,純函數高階函數是兩大重要的角色。

純函數具有相互獨立性和對外封閉性特點:

1、純函數的返回結果只受函數參數的影響,如果輸入參數相同不論在哪調用,何時調用,調用多少次其輸出結果都是一樣的。

2、純函數內部的數據處理不受外部環境的影響也不會影響外部環境,每一個函數內部均有一套屬於自己的局部變量,只在本函數內部調用也只在本函數內部起作用,其取值由函數的初始參數決定,不受外部變量的影響,同時函數的計算結果隻影響函數的返回值,不影響外部變量的值。

高階函數(Higher-order function):允許將函數作爲參數傳入,或者將函數作爲返回值返回的函數稱爲高階函數。通過高階函數可以對純函數進行傳遞,組合,鏈接等操作來解決不能靠單一函數解決的複雜問題。

當遇到單一函數無法解決的複雜問題時,可以將其化整爲零,拆分成能被單一函數處理的小問題,然後通過高階函數對這些單一函數進行組合,鏈接,順序調用進行解決。

3.3.函數響應式編程(Functional Reactive Programming:FRP):

Rxjava,包括一個事件流的發送源,後面跟着0 ~ N個消費者消費事件流,是一種通過一系列函數的組合調用來發送,轉變,監聽,響應數據流的編程範式。

RxJava的函數響應式編程具體表現爲一個觀察者(Observer)訂閱一個被觀察者(Observable),通過創建Observable對象發送數據流,經過一系列操作符(Operators)加工處理和線程調度器(Scheduler)在不同線程間的轉發,最後由觀察者接受並做出響應的一個過程。

RxJava響應式編程的組成:

Observable/Operator(操作符)/ Observer

RxJava響應式編程中的基本流程:

Observable -> Operator1 -> Operator2 -> Operator3 -> Observer

(1)Observable發出一系列事件,他是事件的產生者;

(2)Observer負責處理事件,他是事件的最終消費者;

(3)Operator是對Observable發出的事件進行修改和變換(線程,數據類型,中間計算等等);

(4)若事件從產生到消費不需要其他處理,則可以省略掉中間的Operator,從而流程變爲Obsevable -> Observer;

(5)Observer通常在主線程執行,所以原則上不要去處理太多的事務,而這些複雜的處理則交給Operator;

4. 背壓(Backpressure)

響應式編程中:

(1)同步訂閱:

生產者和消費者工作在同一個線程,生產者每發送1個事件,必須等到消費者接收處理完成後,才能發送下一個事件。

(2)異步訂閱

當生產者和消費者在不同的線程中,通過生產者(Observable)發送,消費者(Observer, Consumer)處理、響應數據流時,生產者不斷髮送事件而不必考慮消費者的處理進度,如果生產者(Observable)發送數據的速度快於消費者(Observer, Consumer接收處理數據的速度,這樣對於那些沒來得及處理的數據就會造成積壓,這些數據既不會丟失,也不會被垃圾回收機制回收,而是存放在一個異步緩存池中(Observable默認緩存池大小128,見Observable.bufferSize();返回的是Flowable的BUFFER_SIZE:

@CheckReturnValue

public static int bufferSize() {
    return Flowable.bufferSize();
}

),如果緩存池中的數據一直得不到處理,越積越多,最後就會造成內存溢出,這便是響應式編程中的背壓(backpressure)問題。

,如果緩存池中的數據一直得不到處理,越積越多,最後就會造成內存溢出,這便是響應式編程中的背壓(backpressure)問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章