Androidアプリを開発する中で、RXJavaを使うことがあるかと思います。
その際、subscribeOnとobserveOnのスケジューラ周りでハマったのでメモ
subscribeOn
subscribeOnはRXJavaのストリーム全体で使うスレッドを指定します。
例えば、次のようなコードがあったら
(https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53aより抜粋)
just("Some String") // Computation
.map(str -> str.length()) // Computation
.map(length -> 2 * length) // Computation
.subscribeOn(Schedulers.computation()) // Computation
.subscribe(number -> Log.d("", "Number " + number));// Computation
これはObservableから流れてくるデータの処理全体をComputationスレッドにて行います。
observeOn
これに対してobserveOnは
just("Some String") // UI
.map(str -> str.length()) // UI
.map(length -> 2 * length) // UI
.observeOn(Schedulers.computation()) // Computation
.subscribe(number -> Log.d("", "Number " + number));// Computation
observeOnを置いた下流以降の処理が指定したスレッドになります。
このコードでは、指定がない場合はUIスレッドで処理していますが、observeOnで指定した後の処理はComputationスレッドにて処理しています。
どう使い分けるか
APIアクセスなど、時間のかかる処理を非同期で行い、データが用意できた段階でSubscriberに通知してあげる処理をRXJavaを使って行う場合を考えます。
その時、非同期で行う処理を行うスレッドをワーカースレッドに指定することが考えられます。
そこで、全体の処理を行うスレッドをsubscribeOnで指定します。
しかし、subscribeを実行して、その中でviewの操作を行う場合はそのままワーカースレッドで行うわけにはいきません。
そこで、view操作を行うときにobserveOnしてUIスレッドで処理をしてあげればview操作が行えます。
参考