情境
透過 RxJava 我們可以很輕易地切換執行緒,透過以下程式碼可以快速地切換執行緒。
說明
透過下列方式可以迅速建立一起一串被觀察的資料,並且切換到一個執行緒上去執行程式。
Observable.just(1,2,3).subscribeOn(Schedulers.single())
而執行緒切換其實有分很多種,先來介紹 Schedulers 底下的工具包。
- single: 固定會開啟一個長度為 1 的 ThreadPool。
- newThread: 每次都會開新的執行緒執行。
- computation: 會使用固定數量的 ThreadPool,透過 cpu 來計算最佳 Thread 數量。
- io: 內部實作了一個 ThreadPool 並且有 cache 機制。
大致上這四個是最常用的,從字面上意義來看的話,使用情境分別是下方。
如果你要一直使用一個單一執行緒,就可以使用 single。
如果你要開一個用完就丟的執行緒,就可以使用 newThread。
如果你要拿來做複雜運算,就可以使用 computation。
如果你有需要處理 io 相關,則可以設定 io。
還有一個比較特別的是在 Android 通常會存在一個 Main Thread,此時,你就不能使用 Schedulers 這個類別了,你必須透過以下方式才能切換到 Main Thread。
Observable.just(1,2,3).subscribeOn(AndroidSchedulers.mainThread())
subscribeOn 與 observeOn 的差別
在前面例子中,我們知道 subscribeOn 是控制一開始執行任務的執行緒。
Observable.just(1,2,3).subscribeOn(Schedulers.single())
這邊比較特別的地方是先設定被觀察的對象以後,再來決定執行緒要走哪一個?但是,observeOn 是先決定接下來的處理任務應該要在哪一個執行緒上處理後,再來處理被觀察者的資料。
Observable.just(1,2,3)
.subscribeOn(AndroidSchedulers.mainThread())
.map { it }
.observeOn(Schedulers.newThread())
.subscribe {
print(it)
}