2017-09-20 9 views

答えて

20

Android LiveDataは、元のオブザーバーパターンの変種であり、アクティブ/非アクティブのトランジションが追加されています。このように、それはその範囲において非常に限定的である。

Android LiveDataに記載されている例を使用すると、位置データを監視し、アプリケーションの状態に基づいて登録および登録解除するためのクラスが作成されます。

RxJavaは、より一般化された演算子を提供します。のは、この観測可能で、位置データを提供することを想定してみましょう:

Observable<LocationData> locationObservable; 

観察できるの実装は、オペレーションを呼び出しを地図に戻るObservable.create()を使用して構築することができます。監視対象が登録されると、コールバックが登録され、登録されていない場合、コールバックは登録解除されます。実装は、この例で提供されているコードと非常によく似ています。

のも、アプリケーションがアクティブであるとき真発すること、観察を持っていると仮定しましょう:

Observable<Boolean> isActive; 

その後、あなたは以下の

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

switchMap()オペレータによってLiveDataのすべての機能を提供することができます現在の場所をストリームとして提供するか、アプリケーションがアクティブでない場合は何も提供しません。 liveLocationが観測可能になったら、RxJava演算子を使用してそれを行うことができる多くのことがあります。私のお気に入りの例は次のとおりです。場所が変更されたときにのみアクションを実行します

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

、および場所は面白いです。 が時間の演算子を結合して速度を決定する同様の操作を作成することができます。さらに重要なのは、RxJava演算子を使用して、メインスレッド、バックグラウンドスレッド、または複数スレッドのいずれで操作が行われるかを詳細に制御できます。

RxJavaのポイントは、ライブラリーから提供された操作、またはユーザーが指定したカスタム操作を使用して、コントロールとタイミングを単一のユニバースにまとめることです。

LiveDataは、そのユニバースの1つの小部分だけをアドレス指定します。これは、liveLocationの構築に相当します。

+1

ありがとうございます。LiveDataドキュメントは、ロケーションサンプルをもう参照していないようです。より興味深い点があります(ロケーションサンプルあり):http://androidkt.com/livedata/ –

関連する問題