モケラ

Tech Sheets

mokelab

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スレッドで実行される

一覧に戻る