博客主頁java
若是你曾經使用過 Java ,那麼你 定據說過面向對象(OOP)的編程思想,也可能據說過 AOP ( Aspect Orient Programming ,面向切面編程)的編程思想。react
在計算機中,響應式編程是一種面向數據流和變化傳播的編程範式。這意味着能夠在編程語言中很方便地表達靜態或動態的數據流,而相關的計算模型會自動將變化的值經過數據流進行傳播。程序員
傳統的編程方式是順序執行的,須要等待直至完成上一個任務以後纔會執行下一個任務。不管是提高機器的性能仍是代碼的性能,本質上都須要依賴上一個任務的完成。若是須要響應迅速,就得把同步執行的方式換成異步執行,方法執行變成消息發送。這就是異步編程的方式,它是響應式編程的重要特性之一。編程
響應式編程有如下幾個特色:segmentfault
如今的 App 不管是原生 H5, HTML5 仍是 Hybird ,都會和與數據事件相關的 UI 事件進行大量的交互,使用響應式編程會顯得更加駕輕就熟。安全
隨着硬件能力的不斷提高,單核 CPU 計算能力幾乎達到極限, CPU 己經進入了多核時代,程序員轉而經過併發編程、分佈式系統來應對愈來愈複雜的計算任務。數據結構
然而井發編程是基於內存共享,多線程編程有常見的死鎖、線程飢餓、競爭條件等問題,並且多線程的 Bug 也難以重現和定位。多線程
在函數式編程中,因爲數據是不可變的 immutable ),所以沒有併發編程的問題,是線程安全的。它將計算機運算看做數學中函數的計算,主要特色是將計算過程分解成多個可複用的函數,而且避免了狀態及變量的概念。架構
函數響應式編程結合了函數式和響應式的優勢,把函數範式裏的一套思路和響應式編程合起來就是函數響應式編程。併發
咱們知道,傳統的面向對象編程是經過抽象出的對象關係來解決問題,函數式編程是經過函數(function)的組合來解決問題,響應式編程是經過函數式編程的方式來解決回調地獄(Callback Hell) 的問題。
用傳統的面向對象來處理異步事件不是很直觀,處理併發也十分麻煩,因此才產生了函數響應式編程。
RxJava是Reactive Extensions Java 實現,用於經過使用 Observable/Flowable 序列來構建異步和基於事件的程序的庫。
RxJava 擴展觀察者模式以支持數據/事件序列,並添加容許你以聲明方式組合序列的操做符,同時提取對低優先級的線程、同步、線程安全性和併發數據結構等問題的隱藏。
ReactiveX 是 Reactive Extensions 的縮寫, 般簡寫爲Rx,最初是 LINQ 個擴展,由微軟架構師Erik.Meijer 領導的團隊所開發,於 2012年11月開源。 Rx是一個編程模型,目標是提供一致的編程接口,幫助開發者更方便地處理異步數據流。Rx 庫支持 .NET、JavaScript和C++。因爲 Rx 近幾年愈來愈流行,所以如今己經支持幾乎所有的流行編程語言。 Rx的大部分語言庫由 ReactiveX 這個組織負責維護,比較流行的有 RxJava RxJS Rx.NET ,社區網站是http://reactivex.io
微軟給的定義是, Rx是一個函數庫,讓開發者能夠利用可觀察序列和 LINQ 風格查詢操做符來編寫異步和基於事件的程序,經過使用Rx, 開發者能夠用 Observables 表示異步數據流,用 LINQ 操做符查詢異步數據流,用 Schedulers 參數化異步數據流的併發處理。能夠這樣定義
Rx: Rx= Observables + LINQ + Schedulers
注:在 RxJava 2.x 中, Observables 包含了 Observables、Flowable、Single、Maybe、Completable等
ReactiveX.io 給的定義是, Rx是一個使用可觀察數據流進行異步編程的編程接口,ReactiveX 結合了觀察者模式、 迭代器模式和函數式編程的精華。
(1) 使用觀察者模式
(2) 簡化代碼
雜的狀態
Rx 擴展了觀察者模式用於支持數據和事件序列,添加了一些操做符,讓你可使用聲明式的方式來組合這些序列,而無須關注底層的實現,如線程、同步、線程安全、併發數據結構和非阻塞I/OI
Rx的Observable 模型讓開發者能夠像使用集合數據同樣操做異步事件流,對異步事件流使用各類簡單、可組合的操做。
對於單層的異步操做來講,Java中的Future 對象的處理方式很是簡單有效,可是一旦涉及嵌套,它們就開始變得異常煩瑣和複雜。 在Java 8 以前,使用 Future 很難很好地組合帶條件的異步執行流程。從另外一方面來講, RxJava 的被觀察者們(Observable/Flowable/Single/Completable/May)一開始就是爲組合異步數據流準備的。
RxJava 的 Observable 不只支持處理單獨的標量值(就像 Future 能夠作的〉,還支持數據序
列,甚至是無窮的數據流,Observable 個抽象概念,適用於任何場景。 Observable 擁有它的Iterable的所有優雅與靈活
Rx 對於井發性或異步性沒有任何特殊的偏好, Observable 能夠用任何方式(如線程池、事件循環、非阻塞I/O、 Actor 模式)來知足咱們的需求。 不管咱們選擇怎樣實現它,不管底層實現是阻塞的仍是非阻塞的,客戶端代碼都將與 Observable 的所有交互當成是異步的。
在 Android 開發中哪些地方可使用 RxJava ?任何地方,包括 App 所依賴的底層框架。
例如,可使用 RxBinding ,它是對 Android View 事件的擴展,能夠對 View 事件使用 RxJava
的各類操做。
對於 Android 的 AsyncTask ,也能夠徹底使用 RxJava 來替代。
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 等
若是個人文章對您有幫助,不妨點個贊鼓勵一下(^_^)