Rx Java 筆記 part-2

Scheduler

liy Elaine
liy Elaine
Published in
4 min readAug 30, 2020

--

上一篇說明了 觀察者 和 被觀察者 的基礎實現, 這一篇要介紹如何分配到不同的 thread

什麼是Scheduler ?

在RxJava中,要調用 thread,必須通過 Scheduler進行調用。

我們可以將Scheduler 是一個 pool,裡面有許多thread。當我們需要在特定的thread 執行時,透過 Scheduler 從 pool 中提取一個 thread,將任務分配我們所需的 thread。

可以分配的 thread

如下是我們可以Scheduler 分配的thread,和他的作用

  1. Schedulers.immediate(): 在當前thread運行,相當於不指定 任何的 thread。
  2. Schedulers.newThread(): 啟用新的 thread。
  3. Schedulers.io(): I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 Scheduler。
  4. Schedulers.computation(): 計算所使用的 Scheduler。
  5. 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

--

--