RxJava運用Scheduler完成多線程操作

  • RxJava運用Scheduler完成多線程操作

Scheduler-調度器 (爲了方便理解可以簡單的認爲rx中的調度器即爲線程

應用Rxjava中如果想在操作符鏈上添加多線程,你可以指定這些操作符(或特定的Observables)運行在指定的調度器上.也就是說RxJava的多線程是由Schedulers操作的

RxJava中Schedulers有很多種
下表展示了RxJava中常用的幾種調度器:

調度器類型 效果
Schedulers.io( ) 用於IO密集型任務,如異步阻塞IO操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 Scheduler。行爲模式和 newThread() 差不多,區別在於 io() 的內部實現是是用一個無數量上限的線程池,可以重用空閒的線程,因此多數情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中,可以避免創建不必要的線程。這個調度器的線程池會根據需要增長;對於普通的計算任務,請使用Schedulers.computation();Schedulers.io( )默認是一個CachedThreadScheduler,很像一個有線程緩存的新線程調度器
Schedulers.computation( ) 用於計算任務,使用的固定的線程池,大小爲 CPU 核數。 這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算,事件循環或和回調處理。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時間會浪費 CPU。
Schedulers.from(executor) 使用指定的Executor作爲調度器
Schedulers.immediate( ) 在當前線程立即開始執行任務,相當於不指定線程。這是默認的 Scheduler
Schedulers.trampoline( ) 當其它排隊的任務完成後,在當前線程排隊開始執行
AndroidSchedulers.mainThread() Android專用的,指定的操作將在 Android 主線程運行
Schedulers.newThread() 總是啓用新線程,並在新線程執行操作。

知道了Schedulser,那麼接下去就要運用了.
下面介紹兩個操作符,對,是操作符.

SubscribeOn -> SubscribeOn 指定了Observable的調度器.

ObserveOn -> 指定observer將會在哪個Scheduler觀察這個Observable.

更具體的說ObserveOn指示一個Observable在一個特定的調度器上調用觀察者的onNext, onError和onCompleted方法,即影響的是subscribe()裏的操作.

簡單來講:
使用RxJava,你可以使用subscribeOn()指定被觀察者代碼運行的線程,使用observerOn()指定訂閱者運行的線程:

代碼實例:

myObservableServices.retrieveImage(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

上述代碼表示,在Subscriber前面執行的代碼都是在I/O線程中運行。最後,操作view的代碼在Android中的UI主線程中運行.

PS:AndroidSchedulers.mainThread()是在Android中才有.而且涉及到更新UI的操作必須用此線程

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