BMI計算アプリを作成してPublishProcessorを理解する2017年03月07日(編集2017年03月07日)TweetAndroidアプリ開発でRxJava2を使うと、UIの実装が便利になります。この記事は、AndroidアプリでRxJava2のPublishProcessorの使い方を記載した記事です。中級者向けサンプルコードAndroid-Rxjava2-DemoRxjava2Rxjavaは、Javaでリアクティブプログラミングをするためのライブラリです。リアクティブプログラミングは、送られてきたデータを受け取るたびに反応して処理をするプログラミングです。Rxjavaはデータを作成して通知する生産者(Publisher)と、データを受け取り処理を行う消費者(Subscriber)で構成されています。Rxjava2ではObservableとほぼ同じ機能を提供するFlowableクラスが新たに導入されました。両者の違いは、Backpressure機能の有無です。インストールRxjavaのインストールの設定をgradleにします。Rxjavaのバージョンはbuild.gradleに次のように記述します。"1.0.5"}Rxjavaの情報は、app/build.gradleに次のように記述します。'junit:junit:4.12'}ビルド後に、RxJava2の実装が可能になります。アプリ設計サンプルとして、以下のようなBMI計算アプリを作成します。アプリ画面Rxjava2のPublishProcessorを使ってBMI値を表示するだけのシンプルなアプリです。身長と体重を変更すると、BMI値を計算して、値とメッセージが更新されます。画面のベースになるActivityを作成します。クラス名はBmiCalculationActivityにします。PublishProcessorPublishProcessorはProcessorです。消費者としてデータを受け取り、そのデータを生産者として通知するインターフェースです。PublishProcessor.create();上記は身長と体重の取得と通知をするPublishProcessorです。消費者と生産者が同じなので、データの型は通知も取得もFloatです。onNextSubscriber(消費者)にデータを通知します。height.onNext(convertFloat(s.toString()));bodyWeight.onNext(convertFloat(s.toString()));上記のheightとbodyWeightは、PublishProcessorオブジェクトなので、消費者としてデータを受け取って、このデータを生産者として通知しています。onNextメソッドを呼び出すと、subscribeに通知します。observeOnobserveOnメソッドは、データを受け取った側(消費者)の処理を、どのようなSchedule上で行うのかを設定するメソッドです。observeOn(AndroidSchedulers.mainThread())observeOnメソッドが指定したSchedulerが設定したスレッド上で、それ以降の処理を行うようになります。上記の処理は、データを受け取る側(消費者)が、AndroidのUIの場合に利用します。このサンプルでは、データを受け取るのがUIのTextViewなので、AndroidSchedulers.mainThread()を使います。viewsが発生します。subscribeWithPublishProcessor(生産者)が通知したデータを購読します。}});subscribeWithはRxjava2で追加されたメソッドです。機能はsubscribeと同じで、生産者が通知したデータを購読します。subscribeWithメソッドは、Subscriberを引数に取ります。多くの場合、DisposableSubscriberやResourceSubscriberを使います。onErrorメソッドとonCompleteのメソッドを使うことで、より細かい処理が実装できます。DisposableDisposableは購読を解除するためのメソッドを持つインターフェースです。height.observeOn(AndroidSchedulers.mainThread()).subscribeの戻り値としてDisposableを取得することで、購読の解除が可能になります。購読の解除をしないと、Androidアプリではメモリリークの原因になります。CompositeDisposableCompositeDisposableは、Disposableを格納する入れ物のクラスです。disposableWeight);複数の購読を利用している場合、上記のようにdisposableをCompositeDisposableに格納しておくと良いでしょう。多くのDisposableがある場合、全てを削除するのは大変です。削除漏れが発生する可能性もあります。CompositeDisposableに格納しておけば、一度に全ての購読を解除することができます。ContextCompat.getColorカラーの値を取得するのはContextCompat.getColorメソッドを使います。以前は、getResources().getColorが使われていましたが、非推奨になりました。R.color.colorRed)非推奨のメソッドはLintチェックが通りません。Baselineの機能を使って、地道にエラーや警告を潰してください。ビルド上記のコードビルドして動作を確認します。身長と体重を変更すると、BMIの計算結果とメッセージを表示するアプリが作成できました。結論PublishProcessorを使うと、消費者としてデータを受け取り、そのデータを生産者として通知することができます。便利な機能なので、使ってみてください。