1. ホーム
  2. アンドロイド

[解決済み】AndroidでRxJavaを使用するタイミングとAndroid Architectural ComponentsのLiveDataを使用するタイミングは?

2022-04-06 16:31:25

質問

AndroidのRxJavaとAndroid Architectural ComponentsのLiveDataを使う理由がわかりません。両者の使用例と違いを説明したコード形式のサンプル例と一緒に説明してもらえると本当に助かります。

どのように解決するのですか?

Android LiveDataは、オリジナルのobserverパターンの変形で、active/inactiveの遷移が追加されています。そのため、非常に限定された範囲での使用となります。

で説明した例を使うと Android LiveData 位置情報を監視し、アプリケーションの状態に応じて登録・解除を行うクラスが作成されます。

RxJavaはより一般化された演算子を提供します。このobservableが位置情報を提供すると仮定してみましょう。

Observable<LocationData> locationObservable;

observableの実装は、以下のようにして構築することができます。 Observable.create() を使用してコールバックの操作をマッピングします。observableが購読されているとき、コールバックは登録され、購読が解除されたとき、コールバックは登録解除されます。実装は、例で提供されたコードと非常に似ています。

また、アプリケーションがアクティブなときにtrueを発するobservableがあると仮定しましょう。

Observable<Boolean> isActive;

そうすると、以下のようにLiveDataの全機能を提供することができます。

Observable<LocationData> liveLocation =
  isActive
    .switchMap( active -> active ? locationObservable : Observable.never() );

switchMap() 演算子は現在の位置をストリームとして提供するか、アプリケーションがアクティブでない場合は何も提供しません。一度 liveLocation RxJavaの演算子を使って、いろいろなことができます。私のお気に入りの例です。

liveLocation.distinctUntilChanged()
  .filter( location -> isLocationInAreaOfInterest( location ) )
  .subscribe( location -> doSomethingWithNewLocation( location ) );

これは、場所が変わったときにのみアクションを実行し、その場所が興味深いものであることを示します。同じような操作で 時間演算子を組み合わせて速度を決定する。さらに重要なことは、RxJavaの演算子を使って、操作がメインスレッドで行われるか、バックグラウンドスレッドで行われるか、複数のスレッドで行われるかを詳細に制御することができることです。

RxJavaのポイントは、ライブラリから提供される操作や、ユーザーが提供するカスタム操作を使って、制御とタイミングを1つの世界に融合させることです。

LiveDataは、その世界のほんの一部分にしか対応していません。 liveLocation .