LoginSignup
9
6

More than 5 years have passed since last update.

subscribeOnとobserveOn

Posted at

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操作が行えます。

参考

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6