techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

RxJavaのObservable生成メソッドを一通り試してみた

RxJavaを使いこなすためにはObservableを理解することが欠かせません。今回はより深くRxJavaを理解するためにObservable生成メソッドの挙動を調べてみました。

RxJava(というかReactivePrograming)については、以前も紹介した以下の記事が大変分かりやすかったです。

主要なObservable生成メソッド

Observableを生成する主要なメソッドの概要を以下の表にまとめました。まだRxJavaを勉強し始めたばかりなので、間違い等あれば指摘していただけるとありがたいです。

Observable生成メソッドはRxJavaの公式サイトを参照してますが、repeatWhenだけよく理解できず…。引き続き調べます。

Creating Observables · ReactiveX/RxJava Wiki · GitHub

メソッド名 概要
just 引数をそのままストリームに流す。オブジェクトを渡すとストリームに流れる値はアドレスとなり、nullを渡すとnullが通知される。
from 引数を連続的なメッセージとしてストリームに流す。コレクションを渡すと個々の要素が1つずつストリームに流される。
repeat 自分より前に接続されたObservableの値を引数で指定した回数ストリームに流す。引数を指定しないと無限にストリームに値を流し続ける。インスタンスメソッドなので事前に作成したObservableにつなげる形じゃないと使えない。
repeatWhen よくわからない…
create subscriberがストリームの値を検知した時の挙動を自分で細かく設定できる。引数に、subscriberが値を検知した際に実行したい処理を定義したメソッドを渡す。
defer 自身がsubscribeされるまで値を流さないようなストリームを作成する。自身がsubscribeされた時、deferの引数に渡したObservable(を生成するメソッド)の値をストリームに流す。defer以前にストリームに流れた値は含まれない。
range 引数に2つの整数で範囲を指定すると、その範囲の値をストリームに流す。両方0にすると何も送らない。マイナスの値を引数にすると例外が発生する。
interval longとTimeUnitを指定すると、指定した間隔ごとに1ずつインクリメントしながら値をストリームに流す。
timer longとTimeUnitを指定すると、指定した時間経過後にストリームに0が流される。
empty ストリームに何の値も流さない。その結果onNextは実行されないがonCompletedは実行される。
error ストリームに何の値も流さずエラーを発生させる。その結果onErrorのみ実行される。
never ストリームに何の値も流さない。neverではonNext, onError, onCompletedのいずれも実行されない。

サンプルコード

上記のメソッドが具体的にどのような挙動になるか確認するためには、Observableを生成する各メソッドの実際に試してみるのが一番です。

ということでサンプルで実際の動きを確認してみました。サンプルはAndroidで動かしていますが、以下では実際の処理部分のみを抜粋しています。

なお以下のサンプルではラムダを使っているので、ラムダが使えない場合はそれぞれ対応するクラスに適宜置き換えてください*1

RxJavaのObservable生成メソッドを試す

*1:というかラムダなかったら辛すぎるのでぜひラムダ使いましょう