【Android】ViewModelの使い方

ViewModel

ViewModelの特徴

  • UI コントローラの肥大化を防ぐ
    アクティビティやフラグメント(総称してUI コントローラ)は、UI表示、ユーザ操作の受取、権限などのOSとのやり取りを行う責務があります。それに加えて、データベースやネットワークからデータを取得するようなことをすると、UI コントローラは肥大化し、保守が難しくなります。これを防ぐためには、UI コントローラは本来やるべきことに注力して、データの保持、データの取得、UI コントローラが使いやすいデータに変換するロジックなどはViewModelに持っていくことが望ましいでしょう。

  • テストをやりやすくする
    UI コントローラは、UIやOSと緊密に連携しているため、それ単独でテストすることが困難です。このようなしがらみのないViewModelを対象とした試験とすることで、比較的簡単に試験を作成することができます。

  • データを保持する
    システムがUIコントローラを破棄すると、UIコントローラが保持しているデータは全て消されます。UIの構成が変化する度に、データを取得しなおしていると、処理コストがかかります。よって、UIコントローラより生存区間の長いViewModelにデータを持たせることによって、効率よくデータの管理が可能となります。

  • フラグメント間のデータ共有
    リスト上のアイテムを選択して、選択した内容を表示するような場合を考えてみると、リストのフラグメントと内容を表示するフラグメントで、どのアイテムを選択したかを共有する必要があります。その時に、ViewModelを使用します。

  • ローダーの置き換え ローダー(CursorLoaderなど)とは、UIとデータベース間でデータを同期する仕組みです。RoomとLiveDataを組み合わせ使用することで、ViewModelでローダーの代わりをすることができます。

ViewModelでやってはいけないこと

  • LiveDataオブジェクトなどの監視はしてはいけない
  • ビュー、Lifecycle、またはアクティビティ コンテキストへの参照が保持されている可能性があるクラスを参照