私は、AndroidでRxJavaを使用したり、Android Architectural ComponentsのLiveDataを使用したりする理由を得ていません。両者の違いを説明するコードの形式で、ユースケースと両者の違いをサンプル例と一緒に説明します。
Android LiveDataは、アクティブ/非アクティブ遷移を追加した、元のオブザーバパターンの変形です。そのように、それはその範囲において非常に制限的です。
Android LiveData で説明されている例を使用して、位置データを監視し、アプリケーションの状態に基づいて登録および登録解除するためのクラスが作成されます。
RxJavaはもっと一般化された演算子を提供します。この観測量が位置データを提供すると仮定しましょう:
Observable<LocationData> locationObservable;
オブザーバブルの実装は、コールバック操作をマップするためにObservable.create()
を使用して構築することができます。オブザーバブルがサブスクライブされると、コールバックは登録され、サブスクライブが解除されると、コールバックは登録解除されます。実装は、例で提供されているコードと非常によく似ています。
また、アプリケーションがアクティブなときに真となる観測量があるとしましょう。
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は、そのユニバースのほんの一部、つまりliveLocation
を構築するのと同じことを扱っています。
元の質問に関しては、RxJavaとLiveDataの両方が互いに非常によく補完されています。
LiveData
はViewModelレイヤーを照らし、AndroidライフサイクルおよびViewModel
と緊密に統合されています。 RxJava
は変換においてより多くの機能を提供します(@Bob Dalgleishが述べたように)。
現在、RxJava
をデータソースとリポジトリのレイヤーに使用しています。そして、ViewModelsでは(LiveData
を使用して)LiveDataReactiveStreams
に変換します(データをアクティビティやフラグメントに公開する前)。このアプローチには非常に満足しています。
実際、LiveData
はRxJava
と本質的に異なるツールではありません。そのため、RxJava
がobservableへのすべてのサブスクリプションをCompositeDispoable
オブジェクトに格納し、Activity
のonDestroy()
に配置することによってライフサイクルを簡単に管理できたのです。または1行のコードのみを使用しているFragment
のonDestroyView()
?
私は一度RxJavaを使ってLiveData here を使って映画検索アプリを構築することでこの質問に完全に答えました。
しかし、要するに、それは可能です、しかしそれは基本的なライフサイクルの知識を持っていること以外に関連するライフサイクル方法を最初にオーバーライドする必要があるでしょう。これはまだ一部の人には意味をなさないかもしれませんが、実際のところ、Google I/O 2018の Jetpackセッションによれば、 のライフサイクル管理は複雑です。ライフサイクルへの依存を処理しないことから発生するクラッシュエラーは、ライフサイクルを知っている場合でも、アプリで使用するすべてのActivity/Fragmentでそのことを忘れてしまう開発者もいます。大規模なアプリケーションでは、生産性に悪影響を及ぼす可能性があるにもかかわらず、これが問題になる可能性があります。
肝心なのは、LiveData
を導入することで、ライフサイクル管理、メモリリーク、クラッシュを理解することさえしなくても、より多くの開発者がMVVMを採用することが期待されるということです。 LiveData
が機能や開発者に与える力の点でRxJava
と同等ではないことに疑いはありませんが、リアクティブプログラミングとRxJava
は理解しにくい概念とツールです。反対に、LiveData
が__variable_nameの代わりになることを意味するとは思いません。RxJava
は単に不可能ではありませんが、多くの開発者が経験する物議を醸している広範な問題を処理するための非常に単純なツールです。
**更新**私はLiveDataを誤用すると予期しない結果になる可能性があることを説明した新しい記事 here を追加しました。 RxJavaはこれらの状況で救助に来ることができます
反応型エコシステムで知っているかもしれませんが、データを放出する Observable と、このObservable放出を購読する(通知を受ける) Observer があります。パターン。 Observableが何かを「叫ぶ」と、Observerがある瞬間に何かを叫ぶことをObserverが通知されます。
LiveData
をactive
の状態にあるオブザーバを管理できるObservableとして考えます。他の用語では、LiveData
は単純なObservable ですが、 はライフサイクルの面倒を見ます。
しかし、あなたが要求する2つのコードケースを見てみましょう:
A)ライブデータ
B)RXジャワ
A) これはLiveDataの基本的な実装です
1)通常はViewModelでLiveDataをインスタンス化して向きの変更を維持します(読み取り専用のLiveData、または書き込み可能なMutableLiveDataを使用できるので、通常はLiveDataクラスから外部に公開します)。
2) Main Activity(ViewModelではなく)のOnCreate
メソッドで、Observerオブジェクトを「サブスクライブ」します(通常はonChangedメソッド)。
3)リンクを確立するために観察する方法を起動します
最初に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と組み合わせると、Observerの変更があるたびに をリアルタイムで更新し続けることができ、 なので必要な場所でイベントをリアルタイムで管理できます。 LiveData
を使用するには、 lifecycle および関連オブジェクト LifeCycleOwner/LifeCycle の概念を知っておくことを強くお勧めします。実際のシナリオでLiveData
を実装する場合は、 変換 を参照してください。ここでは素晴らしい commonsware からいくつかのユースケースを見つけることができます。
をまとめると、基本的にLiveData
は単純化されたRXJava
です。コードをはるかに簡単にテストし、読みやすくします。 RXJavaでは、LiveDataなどのことを実行できます。 RXJavaの拡張機能により、単純な場合にはLiveDataを使用することも、Androidアーキテクチャコンポーネントを ViewModel として使用し続けることでRXJavaのすべての機能を利用することもできます。もちろん、これはRXJava
が可能です。 SwitchMapやMap of LiveDataの代わりに何百もの演算子があると考えてください(現時点では)。
RXJavaバージョン2は、オブジェクト指向パラダイムに革命をもたらし、プログラムの流れを管理するためのいわゆる機能的な方法を追加したライブラリです。
LiveDataとRxJavaには多くの違いがあります。
public class RegistrationViewModel extends ViewModel {
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;
}
}
LiveDataは、Androidチームによって開発されたAndroidアーキテクチャコンポーネントのサブセットです。
ライブデータや他のアーキテクチャコンポーネントでは、メモリリークなどの問題はアーキテクチャコンポーネントによって処理されます。 Androidチームによって開発されているので、Androidに最適です。彼らはまた、Androidの新しいバージョンを処理するアップデートを提供しています。
Androidアプリの開発にのみ使用したい場合は、Androidアーキテクチャコンポーネントを利用してください。それ以外に、Webアプリケーション、デスクトップアプリケーションなどの他のJavaアプリケーションを使用したい場合は、RxJavaを使用してください。
LiveData
はデータ保持者としてのものであり、他には何もありません。 LiveDataはライフサイクルを意識した消費者と言えます。ライフサイクルの概念とライフサイクル関連オブジェクトLifeCycleOwner/LifeCycleを知ることをLiveData
に強くお勧めします。ビジネスロジックの変換とストリーミング機能、およびUIのライフサイクルを意識した操作を取得できます。
Rxは、エレガントな宣言スタイルで問題を解決することを可能にする強力なツールです。ビジネスサイドのオプションやService Apiオペレーションを処理します。