回答:
Android LiveDataは元のオブザーバーパターンの変形で、アクティブ/非アクティブの遷移が追加されています。そのため、その範囲は非常に制限されています。
Android LiveDataで説明されている例を使用して、位置データを監視し、アプリケーションの状態に基づいて登録および登録解除するクラスが作成されます。
RxJavaは、より一般化された演算子を提供します。このオブザーバブルが位置データを提供すると仮定しましょう:
Observable<LocationData> locationObservable;
オブザーバブルの実装は、以下を使用して構築できます。 Observable.create()
コールバック操作のマッピングにして。オブザーバブルがサブスクライブされるとコールバックが登録され、サブスクライブが解除されるとコールバックが登録解除されます。実装は、例で提供されているコードと非常によく似ています。
また、アプリケーションがアクティブなときにtrueを放出するオブザーバブルがあると仮定します。
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のポイントは、ライブラリから提供されるオペレーション、またはユーザーが提供するカスタムオペレーションを使用して、制御とタイミングを単一のユニバースに結合することです。
LiveDataは、そのユニバースの1つの小さな部分のみを扱いますliveLocation
。
The point of RxJava is that it combines control and timing into a single universe, using operations provided from the library, or even custom operations that you provide.
ただし、LiveDataライフサイクルは認識されません。Rxを使用する場合、ライフサイクルの変更を処理する必要はありませんか?
元の質問に関しては、RxJavaとLiveDataの両方が非常によく補完し合っています。
LiveData
Androidのライフサイクルやとの緊密な統合により、ViewModelレイヤーを際立たせていますViewModel
。RxJava
変換でより多くの機能を提供します(@Bob Dalgleishが言及)。
現在、RxJava
データソースレイヤーとリポジトリレイヤーでLiveData
使用してLiveDataReactiveStreams
おり、(アクティビティ/フラグメントにデータを公開する前に)ViewModelで(を使用して)に変換されます。このアプローチに非常に満足しています。
observeOn
、LiveDataReactiveStreams
呼び出すことによって、そのとにかくを行いますLiveData.postValue()
。またsubscribeOn
、一般的に効果があるという保証はありません。
LiveDataとRxJavaの間には多くの違いがあります。
public class RegistrationViewModel extends ViewModel {
Disposable disposable;
private RegistrationRepo registrationRepo;
private MutableLiveData<RegistrationResponse> modelMutableLiveData =
new MutableLiveData<>();
public RegistrationViewModel() {
}
public RegistrationViewModel(RegistrationRepo registrationRepo) {
this.registrationRepo = registrationRepo;
}
public void init(RegistrationModel registrationModel) {
disposable = registrationRepo.loginForUser(registrationModel)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response<RegistrationResponse>>() {
@Override
public void accept(Response<RegistrationResponse>
registrationModelResponse) throws Exception {
modelMutableLiveData.setValue(registrationModelResponse.body());
}
});
}
public LiveData<RegistrationResponse> getModelLiveData() {
return modelMutableLiveData;
}
@Override
protected void onCleared() {
super.onCleared();
disposable.dispose();
}
}
onCleared
。
実際、LiveData
はと本質的に異なるツールではないRxJava
ので、RxJava
オブザーバブルのすべてのサブスクリプションをCompositeDispoable
オブジェクトに格納してonDestroy()
から、Activity
またはonDestroyView()
のFragment
1つだけを使用してそれらを破棄することにより、ライフサイクルを簡単に管理できる アーキテクチャコンポーネントとして導入されたのはなぜですか。コードの行?
私は一度RxJavaを使用して映画検索アプリを作成し、次にLiveDataを使用してこの質問に完全に回答しました。
しかし、要するに、そうすることはできますが、そのためには、基本的なライフサイクルの知識を持つ以外に、まず関連するライフサイクルメソッドをオーバーライドする必要があります。これはまだ一部の人には意味をなさないかもしれませんが、実際には、Google I / O 2018のJetpackセッションの 1つによると、多くの開発者がライフサイクル管理が複雑であることを発見しています。ライフサイクルの依存関係を処理しないことに起因するクラッシュエラーは、一部の開発者が、ライフサイクルを知っていても、アプリで使用するすべてのアクティビティ/フラグメントでその処理を忘れていることを示す別の兆候である可能性があります。大規模なアプリでは、生産性に悪影響を及ぼす可能性があるにもかかわらず、これが問題になる可能性があります。
つまり、を導入LiveData
することで、ライフサイクル管理、メモリリーク、クラッシュを理解しなくても、より多くの開発者がMVVMを採用することが期待されます。機能と開発者に与える力の点でLiveData
比較できないことは間違いありませんRxJava
が、反応型プログラミングRxJava
は多くの人にとって理解しにくい概念とツールです。反対に、私は多くの開発者が経験している論争の的になっている広範囲にわたる問題を処理するための非常にシンプルなツールであるとLiveData
は思いませんRxJava
。
**更新** ここに、LiveDataの誤用が予期しない結果につながる可能性があることを説明した新しい記事を追加しました。RxJavaはこれらの状況で救助に来ることができます
LiveData
onStop
リアクティブエコシステムでは、データを放出するObservableと、このObservable放出をサブスクライブ(通知)するObserverがあることを知っているかもしれませんが、いわゆるObserverパターンがどのように機能するかは奇妙なことではありません。オブザーバブルは何かを「叫び」、オブザーバーは与えられた瞬間にオブザーバブルが何かを叫ぶことを通知されます。
状態LiveData
にあるオブザーバーを管理できるオブザーバブルと考えてくださいactive
。つまりLiveData
、単純なObservableですが、ライフサイクルも処理します。
しかし、リクエストした2つのコードケースを見てみましょう。
A)ライブデータ
B)RXJava
A)これはLiveDataの基本的な実装です
1)通常、ViewModelでLiveDataをインスタンス化して、向きの変更を維持します(読み取り専用のLiveData、または書き込み可能なMutableLiveDataを使用できるため、通常はクラスLiveDataから外部に公開します)。
2)メインアクティビティのOnCreate
メソッド(ViewModelではない)で、Observerオブジェクト(通常は、onChangedメソッド)を「サブスクライブ」します。
3)リンクを確立するためにメソッドObserveを起動します
まずViewModel
(ビジネスロジックを所有)
class ViewModel : ViewModel() { //Point 1
var liveData: MutableLiveData<Int> = MutableLiveData()
}
そしてこれはMainActivity
(可能な限り馬鹿な)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val ViewModelProvider= ViewModelProviders.of(this).get(ViewModel::class.java)
ViewModelProvider.observe(this, Observer {//Points 2 and 3
//what you want to observe
})
}
}
}
B)これはRXJavaの基本的な実装です
1)オブザーバブルを宣言する
2)オブザーバーを宣言する
3)オブザーバーでオブザーバブルをサブスクライブします
Observable.just(1, 2, 3, 4, 5, 6) // Point 1
.subscribe(new Subscriber() { //Points 2 & 3
@Override
public void onCompleted() {
System.out.println("Complete!");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Double value) {
System.out.println("onNext: " + value);
}
});
特に、(これまで見てきたように)アーキテクチャコンポーネントと共にLiveData
使用されLifecycle
、しばしば使用されViewModel
ます。実際LiveData
、をViewModelと組み合わせると、オブザーバーのすべての変更をリアルタイムで更新し続けることができるため、イベントは必要な場所でリアルタイムに管理されます。ライフサイクルLiveData
の概念と関連オブジェクトLifeCycleOwner / LifeCycleを理解するために使用することを強くお勧めします。また、実際のシナリオで実装する場合は、変換を確認することをお勧めします。ここでは、優れたコモンズウェアからいくつかのユースケースを見つけることができます。LiveData
まとめると、基本的にLiveData
は簡略化さRXJava
れた、コンポーネント間に明示的ないわゆる依存関係ルールを作成せずに複数のコンポーネントにわたる変更を監視するための洗練された方法です。これにより、コードのテストが容易になり、コードが読みやすくなります。RXJavaを使用すると、LiveDataなどの機能を実行できます。RXJavaの拡張機能により、単純な場合にLiveDataを使用することも、RXJavaのすべての機能を活用してAndroidアーキテクチャコンポーネントを ViewModelとして使用し続けることもRXJava
できます。もちろん、これははるかに複雑になる可能性があるため、代わりに何百もの演算子があると考えてください。 SwitchMapのマップとLiveDataのマップ(現時点)。
RXJavaバージョン2は、オブジェクト指向のパラダイムに革命をもたらし、プログラムのフローを管理するいわゆる機能的な方法を追加したライブラリです。
LiveDataは、Androidチームによって開発されたAndroidアーキテクチャコンポーネントのサブセットです。
ライブデータやその他のアーキテクチャコンポーネントを使用すると、メモリリークやその他の同様の問題がアーキテクチャコンポーネントによって処理されます。androidチームが開発しているため、androidに最適です。また、Androidの新しいバージョンを処理するアップデートも提供しています。
Androidアプリ開発でのみ使用する場合は、Androidアーキテクチャコンポーネントを使用してください。それ以外の場合、他のJavaアプリ(ウェブアプリ、デスクトップアプリなど)を使用する場合は、RxJavaを使用します。