RxJavaで実行するスレッドを変更する
最終更新日:2017-05-05
Observableやmap/flatmapでの処理をどのスレッドで行うかを指定することができます。
observeOn()
observeOn()は、これを呼んだ以降の処理を指定したスレッドで処理します。よく使うスレッド(スケジューラー)はSchedulers
クラスで用意されています。
- Schedulers.computation() : 計算用のスレッド
- Schedulers.io() : 入出力用のスレッド
また、RxAndroidを追加するとスケジューラーとして次のものが使えるようになります。
- AndroidSchedulers.mainThread() : UIスレッドで実行
- AndroidSchedulers.from(looper) : 指定したLooperで実行
Observable.create(/* */)
.observeOn(Schedulers.computation())
.map(/* */) // ここは計算用スレッドで実行される
.observeOn(Schedulers.io())
.subscribe(/* */); // ここはI/Oスレッドで実行される
subscribeOn()
observeOn()
は呼んだ後の処理をどのスレッドで実行するかを指定する時に使用しました。しかしobserveOn()
ではObservableがデータを作る処理をどのスレッドで実行するかは指定できません。
そこで登場するのがsubscribeOn()
です。メソッド名で推測するとsubscribe()
をどのスレッドで実行するかを指定するメソッドに見えてしまいますが、これはObservableでデータを作る処理をどのスレッドで実行するかを指定するメソッドです。チェーンのどこで呼んでもかまいません。
Observable.create(/* */) // これはI/Oスレッドで実行される
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.map(/* */) // ここは計算用スレッドで実行される
.observeOn(Schedulers.io())
.subscribe(/* */); // ここはI/Oスレッドで実行される