ViewModelとは
詳細はhttps://developer.android.com/topic/libraries/architecture/viewmodel
ざっくり説明すると、Activityのライフサイクルには以下の問題がある。
-
onSaveInstanceState()
を利用したデータの保存は、データ量が多い場合は適していない。 - 非同期処理中に画面が再生成された場合、非同期処理を中止して再実行するなどのリソースが無駄になる。
UIでは、データの表示、ユーザからの要求の対応、OSとのやり取り(権限の取得)を行うようする。
そして、DBへのアクセスやネットワークからのデータの取得は、UIから切り離して実装するほうが良い。
それが容易に実装できるのが、ViewModel
クラス
実装
ViewModel本体の実装
ViewModel
クラスを継承したクラスを実装する。
このクラスには、保持しておきたいデータを定義する。
/**
* ViewModelクラスを継承したクラス
*/
class MainViewModel : ViewModel() {
/**
* 保持するデータ
*/
val name: MutableLiveData<String> by lazy {
// nameを初期化
MutableLiveData<String>().also {
it.value = loadName()
}
}
private fun loadName(): String {
return "initName"
}
}
ViewModelの取得
ActivityやFragmentでViewModelクラスを継承したクラスを取得する。
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
ViewModelにアクセスする
ViewModelが保持している値を取得・変更する。
viewModel.name.value = "new value"
最後に
今回はものすごいシンプルな実装でこれだけだと、あまり効果的な使用方法がぴんと来ないが、
ViewModelを継承したクラスのデータ初期化時の処理を記述することでUIとロジックの分離ができる。
DBへのアクセスやネットワークからのデータ受信はまた今度。