1. 程式人生 > >RxJava學習筆記_原理理解

RxJava學習筆記_原理理解

一、三大程式設計方式

看到有大神部落格精妙總結(https://www.jianshu.com/p/15b2f3d7141a),以大象裝冰箱為例,借鑑過來。

1、函數語言程式設計(面向過程)

    第一步:構建一個函式,接收大象和冰箱兩個引數
    第二步:在此函式內部做實現,返回冰箱已經裝入大象
    第三步:呼叫此函式,將大象和冰箱作為引數傳入

2、面向物件程式設計

    第一步:構建一個冰箱,具有開門,關門的方法
    第二步:構建一個大象,具有走進冰箱的方法
    第三步:例項化一個冰箱物件,例項化一個大象物件,冰箱物件呼叫開門方法,大象物件呼叫走進冰箱方法,冰箱物件呼叫關門方法,大象被成功裝入冰箱。

3、響應式程式設計

    第一步:構建一個發射源,傳送大象
    第二步:構建一個響應器,接受到大象後關進冰箱。
    第三步:用這個響應器監聽發射源。

 

二、RxJava是基於 函數語言程式設計+響應式程式設計 疊加後的程式設計方式

函式響應式程式設計(Functional Reactive Programming:FRP):是一種通過一系列函式的組合呼叫來發射,轉變,監聽,響應資料流的程式設計正規化。
在RxJava中,函式響應式程式設計具體表現為一個觀察者(Observer)訂閱一個可觀察物件(Observable),通過建立可觀察物件發射資料流,經過一系列操作符(Operators)加工處理和執行緒排程器(Scheduler)在不同執行緒間的轉發,最後由觀察者接受並做出響應的一個過程。

 

三、RxJava2 中五對觀察者模式

1、ObservableSource/Observer

一次可以傳送單條資料或者資料序列onNext,完成後可以傳送onComplete通知或onError異常通知,不支援背壓。

2、Publisher/Subscriber

在ObservableSource/Observer基礎上進行改進,支援背壓,一次可以傳送單條資料或者資料序列onNext,也可以在完成時傳送onComplete通知或onError異常通知,但效率沒有ObservableSource/Observer高(初步猜測是背壓策略原因)。

3、SingleSource/SingleObserver

ObservableSource/Observer的簡化版,只能傳送單條資料,可傳送onSuccess與onError通知,不支援背壓。

4、CompletableSource/CompletableObserver

ObservableSource/Observer簡化版,不能傳送資料,只發送onComplete或onError通知,不支援背壓。

5、MaybeSource/MaybeObserver

SingleSource/SingleObserver與CompletableSource/CompletableObserver的合併版,只能傳送單條資料,可以傳送onSuccess與onComplete或onError通知,不支援背壓。

 

四、RxJava背壓

作用:控制事件傳送與接收的速度。

因被觀察者傳送事件速度 與 觀察者接收事件速度 不匹配(一般是前者 快於 後者),從而導致觀察者無法及時響應 / 處理所有 被觀察者傳送事件 ,故便有了背壓策略。

如:網路請求,具體場景:有很多網路請求需要執行,但執行者的執行速度沒那麼快,此時就需要使用背壓策略來進行控制。

 

使用:Flowable

詳細:https://blog.csdn.net/carson_ho/article/details/79081407

 

五、RxJava多執行緒

RxJava支援將操作符指定在對應的排程器上,使用Schedulers。Android中同樣有AndroidSchedulers。

排程器型別 效果
Schedulers.computation( ) 用於計算任務,如事件迴圈或和回撥處理,不要用於IO操作(IO操作請使用Schedulers.io());預設執行緒數等於處理器的數量
Schedulers.from(executor) 使用指定的Executor作為排程器
Schedulers.immediate( ) 在當前執行緒立即開始執行任務
Schedulers.io( ) 用於IO密集型任務,如非同步阻塞IO操作,這個排程器的執行緒池會根據需要增長;對於普通的計算任務,請使用Schedulers.computation();Schedulers.io( )預設是一個CachedThreadScheduler,很像一個有執行緒快取的新執行緒排程器
Schedulers.newThread( ) 為每個任務建立一個新執行緒
Schedulers.trampoline( ) 當其它排隊的任務完成後,在當前執行緒排隊開始執行