web-dev-qa-db-ja.com

BaseObservableを拡張するViewModelとAndroid ViewModel Classの違いは何ですか?

現在MVVMのアーキテクチャパターンについて研究していますが、BaseObservableを拡張するカスタムViewModelクラスと、Android自体によって提供される別のViewModelとの間で混乱しました。

14
Urvish rana

カスタムViewModelは単にビューのデータホルダーであり、ビューにバインドされているため(そしてObservableオブジェクトであるため)、データの変更についてビューに通知できます。ただし、向きの変更(ビューの回転)などの構成変更は認識されないため、このような場合、プログラマはデータを保存して復元する必要があります ここの例

一方、Android=によって提供されるViewModelはこれらの構成変更を認識しているため、そのデータはアクティビティのライフサイクル全体で一貫しています。ViewModelはアクティビティが破棄されると破棄されます。

4
Mr.Q

ViewModel()スーパークラスとAndroidViewModel()スーパークラスの主な違いは、AndroidViewModel()がアプリケーションのコンテキストへの参照(アクティビティコンテキスト自体ではない)を持っていることです。

アクティビティは、(電話の回転など)構成が変更されたときに破棄され、再作成されることになっています。したがって、メモリリーク(破壊されたアクティビティへの参照)が発生する傾向があるため、ViewModelにコンテキストを渡すことはお勧めできません。

ViewModelはこれらの構成変更に耐えることを目的としていますが、ViewModel()はContextへの参照を持ちません。

一方、AndroidViewModel()にはアプリケーション(特別なタイプのコンテキスト)の参照があるため、packageManagerなどのアプリケーション固有の情報にアクセスできます。

class MyViewModel(application: Application) : AndroidViewModel(application)
0
Daniel Andujar