時刻表示アプリを作成してFlowableを理解する2017年03月05日(編集2017年03月05日)TweetAndroidアプリ開発でRxJava2を使うと、UIの実装が便利になります。この記事は、AndroidアプリでRxJava2のFlowableの使い方を記載した記事です。中級者向けサンプルコードAndroid-Rxjava2-DemoRxjava2Rxjavaは、Javaでリアクティブプログラミングをするためのライブラリです。リアクティブプログラミングは、送られてきたデータを受け取るたびに反応して処理をするプログラミングです。Rxjavaはデータを作成して通知する生産者(Publisher)と、データを受け取り処理を行う消費者(Subscriber)で構成されています。Rxjava2ではObservableとほぼ同じ機能を提供するFlowableクラスが新たに導入されました。両者の違いは、Backpressure機能の有無です。Backpressureについてはここで詳しく説明しています。インストールRxjavaのインストールの設定をgradleにします。Rxjavaのバージョンはbuild.gradleに次のように記述します。"1.0.5"}Rxjavaの情報は、app/build.gradleに次のように記述します。'junit:junit:4.12'}ビルド後に、RxJava2の実装が可能になります。アプリ設計サンプルとして、以下のような時刻表示アプリを作成します。アプリ画面Rxjava2のFlowableを使って現在の時間を表示するだけのシンプルなアプリです。画面のベースになるActivityを作成します。クラス名はTimeDisplayActivityにします。FlowableFlowableは、Publisherを実装した生産者のクラスです。Rxjava2から導入されたクラスで、Rxjava1から存在するObservableとほとんど同じ機能を提供します。Observableとの違いは、Backpressureの機能が利用できることです。Flowableまた、Flowableはcoldな生産者です。coldな生産者では、subscribeされるたびにデータを通知するストリームが作成されます。Rxjavaでは、基本的にcoldな生産者になります。BackpressureBackpressureは、データを通知する量をコントロールする機能です。Rxjava2では、FlowableだけがBackpressureの機能を持っています。Observableにはありません。この機能は、データの通知スピードが受け取り側の処理より早い場合に利用します。通知スピードが受け取り側の処理より早い場合、受け取り側の処理が間に合わなくて、処理待ちのデータがたまってしまいます。これを解決するのがBackpressureです。Rxjava2から、ObservableでBackpressureの機能が利用できなくなったことも認識しておきましょう。Backpressureの機能を利用していない場合は、FlowableとObservableの違いを気にする必要はありません。intervalintervalメソッドは引数に指定した間隔で、Flowableオブジェクト(生産者)を発行します。observeOnobserveOnメソッドは、データを受け取った側(消費者)の処理を、どのようなSchedule上で行うのかを設定するメソッドです。observeOn(AndroidSchedulers.mainThread())observeOnメソッドが指定したSchedulerが設定したスレッド上で、それ以降の処理を行うようになります。上記の処理は、データを受け取る側(消費者)が、AndroidのUIの場合に利用します。このサンプルでは、データを受け取るのがUIのTextViewなので、AndroidSchedulers.mainThread()を使います。viewsが発生します。subscribeFlowable(生産者)が通知したデータを、消費者が購読します。updateTimeView();});このサンプルの購読する消費者はTextViewです。Rxjava2では、ほぼ同じ機能であるsubscribeWithメソッドも使用できます。このサンプルコードでは不要なので、使用しません。LocalDateTimeJava8から導入された日付クラスです。Androidでは利用できないので、バックポートで取り入れています。Disposable購読を解除します。disposable.dispose();}isDisposed()メソッドで購読状態を判定してから、購読を解除します。ビルド上記のコードビルドして動作を確認します。アプリ画面1秒間隔で更新される時刻が表示できました。結論RxJava2を使うと少ないコード量で通知と受信の実装が可能です。理解するまでが大変ですが、使ってみてください。