如何使用RxJava的執行緒切換

如何使用RxJava的執行緒切換

情境

透過 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)
  }