Posted at

subscribeOnとobserveOn

More than 1 year has passed since last update.

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


参考

http://techlife.cookpad.com/entry/2015/04/13/170000

https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a