Rx Java 筆記 part-2
Scheduler
上一篇說明了 觀察者 和 被觀察者 的基礎實現, 這一篇要介紹如何分配到不同的 thread
什麼是Scheduler ?
在RxJava中,要調用 thread,必須通過 Scheduler進行調用。
我們可以將Scheduler 是一個 pool,裡面有許多thread。當我們需要在特定的thread 執行時,透過 Scheduler 從 pool 中提取一個 thread,將任務分配我們所需的 thread。
可以分配的 thread
如下是我們可以Scheduler 分配的thread,和他的作用
- Schedulers.immediate(): 在當前thread運行,相當於不指定 任何的 thread。
- Schedulers.newThread(): 啟用新的 thread。
- Schedulers.io(): I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 Scheduler。
- Schedulers.computation(): 計算所使用的 Scheduler。
- AndroidSchedulers.mainThread(): 將操作指定在 Android Main Thread運行。
如何分配到不同的 Thread?
subscribeOn() : 指定 observable 要發出事件項目的thread,如果我們不使用subscribeOn(),則所有發出的事件都直接在執行的thread上發生。 當使用多個 subscribeOn() 的時候,只有第一個 subscribeOn() 起作用
observeOn( ) :指定observer 接收 & 響應事件的thread,如果想要多次改變thread,可以多次使用 observeOn
例子:
下面我們在subscribeOn()中 傳入Schedulers.io() , Scheduler 在 IO thread , 發出要被觀察的事件。
而在 observeOn 中我們傳入 AndroidSchedulers.mainThread(), 代表我們會在 main Thread 接收事件
Observable.just("1","2","3","4")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe{
Log.d("recorder", "number:" + it)
}
多次切換 Thread
如下我們切換了多次接收響應事件的 thread, 中間利用 map 把接收事件的thread 打印出來,最後打印observer 訂閱的 thread
repeatlyDisposable = Observable.just(10)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.map{
Log.d("recorder", " tranction to : " + currentThread().getName())
}
.observeOn(Schedulers.newThread())
.map{
Log.d("recorder"," tranction to :" + currentThread().getName())
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.d("recorder","subscribe on: " + currentThread().getName())
}
打印出來的結果
2020–08–30 09:30:17.659 27978–28106/? D/recorder: tranction to : RxComputationThreadPool-1
2020–08–30 09:30:17.659 27978–28107/? D/recorder: tranction to : RxNewThreadScheduler-1
2020–08–30 09:30:17.677 27978–27978/? D/recorder: subscribe on: main