web-dev-qa-db-ja.com

AndroidでRxJavaを使用するとき、およびAndroid Architectural ComponentsからLiveDataを使用するとき

私は、AndroidでRxJavaを使用したり、Android Architectural ComponentsのLiveDataを使用したりする理由を得ていません。両者の違いを説明するコードの形式で、ユースケースと両者の違いをサンプル例と一緒に説明します。

125
rahul66

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を構築するのと同じことを扱っています。

91
Bob Dalgleish

元の質問に関しては、RxJavaとLiveDataの両方が互いに非常によく補完されています。

LiveDataはViewModelレイヤーを照らし、AndroidライフサイクルおよびViewModelと緊密に統合されています。 RxJavaは変換においてより多くの機能を提供します(@Bob Dalgleishが述べたように)。

現在、RxJavaをデータソースとリポジトリのレイヤーに使用しています。そして、ViewModelsでは(LiveDataを使用して)LiveDataReactiveStreamsに変換します(データをアクティビティやフラグメントに公開する前)。このアプローチには非常に満足しています。

75
kzotin

実際、LiveDataRxJavaと本質的に異なるツールではありません。そのため、RxJavaがobservableへのすべてのサブスクリプションをCompositeDispoableオブジェクトに格納し、ActivityonDestroy()に配置することによってライフサイクルを簡単に管理できたのです。または1行のコードのみを使用しているFragmentonDestroyView()

私は一度RxJavaを使ってLiveData here を使って映画検索アプリを構築することでこの質問に完全に答えました。

しかし、要するに、それは可能です、しかしそれは基本的なライフサイクルの知識を持っていること以外に関連するライフサイクル方法を最初にオーバーライドする必要があるでしょう。これはまだ一部の人には意味をなさないかもしれませんが、実際のところ、Google I/O 2018の Jetpackセッションによれば、 のライフサイクル管理は複雑です。ライフサイクルへの依存を処理しないことから発生するクラッシュエラーは、ライフサイクルを知っている場合でも、アプリで使用するすべてのActivity/Fragmentでそのことを忘れてしまう開発者もいます。大規模なアプリケーションでは、生産性に悪影響を及ぼす可能性があるにもかかわらず、これが問題になる可能性があります。

肝心なのは、LiveDataを導入することで、ライフサイクル管理、メモリリーク、クラッシュを理解することさえしなくても、より多くの開発者がMVVMを採用することが期待されるということです。 LiveDataが機能や開発者に与える力の点でRxJavaと同等ではないことに疑いはありませんが、リアクティブプログラミングとRxJavaは理解しにくい概念とツールです。反対に、LiveDataが__variable_nameの代わりになることを意味するとは思いません。RxJavaは単に不可能ではありませんが、多くの開発者が経験する物議を醸している広範な問題を処理するための非常に単純なツールです。

**更新**私はLiveDataを誤用すると予期しない結果になる可能性があることを説明した新しい記事 here を追加しました。 RxJavaはこれらの状況で救助に来ることができます


24
Ali Nem

反応型エコシステムで知っているかもしれませんが、データを放出する Observable と、このObservable放出を購読する(通知を受ける) Observer があります。パターン。 Observableが何かを「叫ぶ」と、Observerがある瞬間に何かを叫ぶことをObserverが通知されます。

LiveDataactiveの状態にあるオブザーバを管理できる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);
       }
    });

特にLiveDataLifecycle、そしてしばしば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は、オブジェクト指向パラダイムに革命をもたらし、プログラムの流れを管理するためのいわゆる機能的な方法を追加したライブラリです。

21
trocchietto

LiveDataとRxJavaには多くの違いがあります。

  1. LiveDataはSTREAMではありませんが、RxJavaではすべて(文字通りすべて)はSTREAMです。
  2. LiveDataは、観察可能なデータホルダークラスです。通常の監視対象とは異なり、LiveDataはライフサイクルを意識しています。つまり、アクティビティ、フラグメント、サービスなどの他のアプリコンポーネントのライフサイクルを尊重します。この認識により、LiveDataはアクティブなライフサイクル状態にあるアプリコンポーネントオブザーバーのみを更新します。
  3. LiveDataは同期なので、RxJavaの場合のようにLiveDataだけを使用してコードの塊(ネットワーク呼び出し、データベース操作など)を非同期に実行することはできません。
  4. この2つの部分を最大限に活用するには、RxJavaをビジネスロジック(ネットワーク呼び出し、データ操作など、 Repository 以降で発生するもの)に使用し、LiveDataを使用するのが最善です。あなたのプレゼンテーション層のために。これによって、あなたはあなたのビジネスロジックとライフサイクルを意識したオペレーションのための変換とストリーミング機能を手に入れることができます。
  5. LiveDataとRxJavaは、を一緒に使用すると互いに補完します。つまり、RxJavaを使ってすべてを行い、最後にUIを更新するときは、ObservableをLiveDataに変更するために以下のコードのようなことをします。そのため、あなたのView(UI)はViewModelのLiveDataに注目します。そこではあなたのLiveDataは変更不可能なMutableLiveDataにすぎません(またはMutableLiveDataは変更可能なLiveDataです)。
  6. では、ここでの質問は、なぜそもそもLiveDataを使用すべきなのでしょうか?以下のコードでわかるように、RxJavaからの応答をMutableLiveData(またはLiveData)に格納します。 LiveDataはライフサイクルに対応しているので、ある意味ではデータはライフサイクルに対応しています。さて、あなたのデータ自体がUIをいつ更新するのか、いつ更新するのかを知っている可能性を想像してください。
  7. LiveDataには履歴がありません(単なる現在の状態)。したがって、チャットアプリケーションにLiveDataを使用しないでください。
  8. LiveDataをRxJavaと一緒に使用する場合、 MediatorLiveData SwitchMap などのようなものは必要ありません。これらはストリーム制御ツールであり、RxJavaの方が優れています。何度も。
  9. LiveDataをデータホルダーのものとして見てください。 LiveDataはライフサイクルを意識した消費者であるとも言えます。

    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;
        }
    }
15
Abhishek Kumar

LiveDataは、Androidチームによって開発されたAndroidアーキテクチャコンポーネントのサブセットです。

ライブデータや他のアーキテクチャコンポーネントでは、メモリリークなどの問題はアーキテクチャコンポーネントによって処理されます。 Androidチームによって開発されているので、Androidに最適です。彼らはまた、Androidの新しいバージョンを処理するアップデートを提供しています。

Androidアプリの開発にのみ使用したい場合は、Androidアーキテクチャコンポーネントを利用してください。それ以外に、Webアプリケーション、デスクトップアプリケーションなどの他のJavaアプリケーションを使用したい場合は、RxJavaを使用してください。

3
SIVAKUMAR.J

LiveDataはデータ保持者としてのものであり、他には何もありません。 LiveDataはライフサイクルを意識した消費者と言えます。ライフサイクルの概念とライフサイクル関連オブジェクトLifeCycleOwner/LifeCycleを知ることをLiveDataに強くお勧めします。ビジネスロジックの変換とストリーミング機能、およびUIのライフサイクルを意識した操作を取得できます。

Rxは、エレガントな宣言スタイルで問題を解決することを可能にする強力なツールです。ビジネスサイドのオプションやService Apiオペレーションを処理します。

0
Attif