RxJava(一):介紹

博客主頁java

1. 函數晌應式編程的概念

若是你曾經使用過 Java ,那麼你 定據說過面向對象(OOP)的編程思想,也可能據說過 AOP ( Aspect Orient Programming ,面向切面編程)的編程思想。react

1.1 響應式編程( Reactive Programming ,簡稱 RP )

在計算機中,響應式編程是一種面向數據流和變化傳播的編程範式。這意味着能夠在編程語言中很方便地表達靜態或動態的數據流,而相關的計算模型會自動將變化的值經過數據流進行傳播。程序員

傳統的編程方式是順序執行的,須要等待直至完成上一個任務以後纔會執行下一個任務。不管是提高機器的性能仍是代碼的性能,本質上都須要依賴上一個任務的完成。若是須要響應迅速,就得把同步執行的方式換成異步執行,方法執行變成消息發送。這就是異步編程的方式,它是響應式編程的重要特性之一。編程

響應式編程有如下幾個特色:segmentfault

  1. 異步編程:提供了合適的異步編程模型,可以挖掘多核 CPU 的能力、提升效率、下降延遲和阻塞等。
  2. 數據流:基於數據流模型,響應式編程提供一套統一的 Stream 風格的數據處理接口。與 Java 中的 Stream 相比,響應式編程除了支持靜態數據流,還支持動態數據流,而且容許複用和同時接入多個訂閱者。
  3. 變化傳播:簡單來講就是以一個數據流爲輸入,通過一連串操做轉化爲另外一個數據流,而後分發給各個訂閱者的過程。這就有點像函數式編程中的組合函數,將多個函數串聯起來,把一組輸入數據轉化爲格式迥異的輸出數據。

如今的 App 不管是原生 H5, HTML5 仍是 Hybird ,都會和與數據事件相關的 UI 事件進行大量的交互,使用響應式編程會顯得更加駕輕就熟。安全

1.2 函數式編程( Functional Programming ,簡稱 FP)

隨着硬件能力的不斷提高,單核 CPU 計算能力幾乎達到極限, CPU 己經進入了多核時代,程序員轉而經過併發編程、分佈式系統來應對愈來愈複雜的計算任務。數據結構

然而井發編程是基於內存共享,多線程編程有常見的死鎖、線程飢餓、競爭條件等問題,並且多線程的 Bug 也難以重現和定位。多線程

在函數式編程中,因爲數據是不可變的 immutable ),所以沒有併發編程的問題,是線程安全的。它將計算機運算看做數學中函數的計算,主要特色是將計算過程分解成多個可複用的函數,而且避免了狀態及變量的概念。架構

1.3 函數響應式編程( Functional Reactive Programming ,簡稱 FRP)

函數響應式編程結合了函數式和響應式的優勢,把函數範式裏的一套思路和響應式編程合起來就是函數響應式編程。併發

咱們知道,傳統的面向對象編程是經過抽象出的對象關係來解決問題,函數式編程是經過函數(function)的組合來解決問題,響應式編程是經過函數式編程的方式來解決回調地獄(Callback Hell) 的問題。

用傳統的面向對象來處理異步事件不是很直觀,處理併發也十分麻煩,因此才產生了函數響應式編程。

2. RxJava 簡介

2.1 RxJava 產生的由來

RxJava是Reactive Extensions Java 實現,用於經過使用 Observable/Flowable 序列來構建異步和基於事件的程序的庫。

RxJava 擴展觀察者模式以支持數據/事件序列,並添加容許你以聲明方式組合序列的操做符,同時提取對低優先級的線程、同步、線程安全性和併發數據結構等問題的隱藏。

2.2 什麼是 Rx

ReactiveX 是 Reactive Extensions 的縮寫, 般簡寫爲Rx,最初是 LINQ 個擴展,由微軟架構師Erik.Meijer 領導的團隊所開發,於 2012年11月開源。 Rx是一個編程模型,目標是提供一致的編程接口,幫助開發者更方便地處理異步數據流。Rx 庫支持 .NET、JavaScript和C++。因爲 Rx 近幾年愈來愈流行,所以如今己經支持幾乎所有的流行編程語言。 Rx的大部分語言庫由 ReactiveX 這個組織負責維護,比較流行的有 RxJava RxJS Rx.NET ,社區網站是http://reactivex.io

2.3 ReactiveX 的歷史

微軟給的定義是, Rx是一個函數庫,讓開發者能夠利用可觀察序列和 LINQ 風格查詢操做符來編寫異步和基於事件的程序,經過使用Rx, 開發者能夠用 Observables 表示異步數據流,用 LINQ 操做符查詢異步數據流,用 Schedulers 參數化異步數據流的併發處理。能夠這樣定義
Rx: Rx= Observables + LINQ + Schedulers

注:在 RxJava 2.x 中, Observables 包含了 Observables、Flowable、Single、Maybe、Completable等

ReactiveX.io 給的定義是, Rx是一個使用可觀察數據流進行異步編程的編程接口,ReactiveX 結合了觀察者模式、 迭代器模式和函數式編程的精華。

2.4 Rx 模式

(1) 使用觀察者模式

  • 建立: Rx 能夠方便地建立事件流和數據流
  • 組合: Rx 使用查詢式的操做符組合和變換數據流
  • 監聽: Rx 能夠訂閱任何可觀察的數據流並執行操做

(2) 簡化代碼

  • 函數式風格: 對可觀察的數據流使用無反作用的輸入/輸出函數,避免了程序裏錯綜復

雜的狀態

  • 簡化代碼: Rx 操做符一般能夠將複雜的難題簡化爲不多的幾行代碼
  • 異步錯誤處理: 傳統的 try/catch 沒辦法處理異步計算, Rx 提供了合適的錯誤處理機制
  • 輕鬆使用井發: Rx的Observables (包括 Observable、Flowable、Single、Completable和Maybe )和 Schedulers 可讓開發者擺脫底層的線程同步和各類併發問題

3. 爲什麼選擇 RxJava

Rx 擴展了觀察者模式用於支持數據和事件序列,添加了一些操做符,讓你可使用聲明式的方式來組合這些序列,而無須關注底層的實現,如線程、同步、線程安全、併發數據結構和非阻塞I/OI

Rx的Observable 模型讓開發者能夠像使用集合數據同樣操做異步事件流,對異步事件流使用各類簡單、可組合的操做。

  1. 可組合

對於單層的異步操做來講,Java中的Future 對象的處理方式很是簡單有效,可是一旦涉及嵌套,它們就開始變得異常煩瑣和複雜。 在Java 8 以前,使用 Future 很難很好地組合帶條件的異步執行流程。從另外一方面來講, RxJava 的被觀察者們(Observable/Flowable/Single/Completable/May)一開始就是爲組合異步數據流準備的。

  1. 更靈活

RxJava 的 Observable 不只支持處理單獨的標量值(就像 Future 能夠作的〉,還支持數據序
列,甚至是無窮的數據流,Observable 個抽象概念,適用於任何場景。 Observable 擁有它的Iterable的所有優雅與靈活

  1. 無偏見

Rx 對於井發性或異步性沒有任何特殊的偏好, Observable 能夠用任何方式(如線程池、事件循環、非阻塞I/O、 Actor 模式)來知足咱們的需求。 不管咱們選擇怎樣實現它,不管底層實現是阻塞的仍是非阻塞的,客戶端代碼都將與 Observable 的所有交互當成是異步的。

4. RxJava 能作什麼

在 Android 開發中哪些地方可使用 RxJava ?任何地方,包括 App 所依賴的底層框架。

例如,可使用 RxBinding ,它是對 Android View 事件的擴展,能夠對 View 事件使用 RxJava
的各類操做。

對於 Android 的 AsyncTask ,也能夠徹底使用 RxJava 來替代。

5. RxJava 2 的 Hello World

RxJava 版本的 Hello World

Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        emitter.onNext("Hello World!");
    }
}).subscribe(new Consumer<String>() {
    @Override
    public void accept(String s) throws Exception {
        Log.d(TAG, "accept: " + s);
    }
});

這個寫法比較長,能夠簡單一點的寫法

Observable.just("Hello World!").subscribe(new Consumer<String>() {
    @Override
    public void accept(String s) throws Exception {
        Log.d(TAG, "accept: " + s);
    }
});

還能夠藉助 Lambda 表達式再簡化

Observable.just("Hello World!").subscribe(System.out::println);

目前在移動端能夠看到大量使用 RxJava 來編寫的代碼,也所以產生了大量的優秀框架,好比 RxBinding Retrofit RxLifecycle 等

若是個人文章對您有幫助,不妨點個贊鼓勵一下(^_^)

相關文章
相關標籤/搜索