【Kotlin/Android/RxJava】observeOn/subscribeOnでスレッドを変更する方法
この記事からわかること
- Android Studio/KotlinでRxJavaの使い方
- Schedulerとは?
- 実行するスレッドを変更する方法
- observeOn/subscribeOnメソッドの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Schedulerとは?
Schedulerとは処理を実行するスレッドを管理するための仕組みです。ネットワークリクエストやCPU負荷の高い計算などバックグラウンドスレッドで実行したい処理やUI更新などのメインスレッドで実行したい処理を適切なスレッドで実行するために重要になってきます。
Schedulerの種類
SchedulerはSchedule
クラスより提供されており、またRxAndroidを導入することでAndroidSchedulers
クラスも使えるようになります。主に使うのは以下の3つかと思います。
- Schedulers.io():入出力用のスレッド(バックグラウンドスレッド)
- Schedulers.computation():計算用のスレッド(バックグラウンドスレッド)
- AndroidSchedulers.mainThread():UIスレッド(メインスレッド)
スレッドを切り替えるメソッド
RxJavaでスレッドを切り替えるためのメソッドとしてobserveOn
とsubscribeOn
メソッドの2つが用意されています。両者ともObservableオブジェクトからメソッドチェーンで呼び出して使用します。
observeOnメソッド
observeOn
はObserverが処理を実行するスレッドを指定するためのメソッドです。observeOn
メソッドを呼び出した以降の処理のスレッドを明示的に変更することができます。observeOn
はチェーン内で複数回の呼び出しが可能でスレッドをこまめに切り替えることができます。
disposable = Observable.create<String> { emitter ->
emitter.onNext("Hello")
emitter.onNext("World")
}.observeOn(Schedulers.computation()) // 計算用スレッドに切り替え
.map { it.length } // 計算の重い処理
.observeOn(AndroidSchedulers.mainThread()) // メインスレッドに切り替え
.subscribe(
// UI更新処理など
{ length -> Log.e("RxJava", length.toString()) }
)
subscribeOnメソッド
subscribeOn
はObservableオブジェクトが処理を実行するスレッドを指定するためのメソッドです。subscribeOn
はチェーン内で1回のみ呼び出しが可能です。要するにObservableオブジェクトがデータを生成するスレッドを指定することができるので、APIやDBのCRUD処理などからイベントを発火させている場合などに明示的にバックグラウンドスレッド(IO)を指定することができるようになります。
disposable = Observable.create<String> { emitter ->
emitter.onNext("Hello")
// APIやDBなどのCRUD処理
// ここがIOスレッドで実行される
}.subscribeOn(Schedulers.io())
.subscribe(
// 途中で明示的にスレッドを指定(observeOn)しない場合はObservableと同じスレッドになる(IO)
{ length --> Log.e("RxJava", length.toString()) }
)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。