私は Android LiveDataのドキュメント を読みました:
ObserveForever(Observer)メソッドを使用して、関連付けられたLifecycleOwnerオブジェクトなしでオブザーバーを登録できます。この場合、オブザーバーは常にアクティブであると見なされるため、変更について常に通知されます。 removeObserver(Observer)メソッドを呼び出して、これらのオブザーバーを削除できます。
ViewModel を使用してMVVMアーキテクチャパターンを使用するアプリを構築し、ViewModelクラス内でLiveDataを宣言しています。私のviewModelでobserveForever
をLiveDataに設定しました:
val password by lazy {
MutableLiveData<String>()
}
init {
initObservable()
}
private fun initObservable() {
password.observeForever {
...
}
}
ドキュメントから理解したことから、(前のコードで)ViewModelをインスタンス化するビューが破棄されるたびに、オブザーバーを削除する必要がありますよね?しかし、ビューが破棄されると、オブザーバーが破棄されるべきではありませんか(ViewModelインスタンスがビューでインスタンス化され、同時に破棄されるため)。
ドキュメントから理解したことから、ViewModelをインスタンス化するビューのたびにオブザーバーを削除する必要があります
これを実現するには、ビュー(アクティビティ、フラグメント)内でビューモデルをインスタンス化し、次のようなライブデータを観察する必要があります
val model = ViewModelProviders.of(this).get(MyViewModel::class.Java)
model.getUsers().observe(this, Observer<List<User>>{ users ->
// update UI
})
this
を渡すことにより、ライブデータの監視をview's
ライフサイクルなので、ビュー(アクティビティ、フラグメント)が破棄されると、ビューモデルとオブザーバーの両方が破棄されます。