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( ) | 當其它排隊的任務完成後,在當前執行緒排隊開始執行 |