web-dev-qa-db-ja.com

ObserveForeverとしてLiveDataに追加されたオブザーバーを削除する必要があるのはなぜですか?

私は 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インスタンスがビューでインスタンス化され、同時に破棄されるため)。

6
Ana Paula

ドキュメントから理解したことから、ViewModelをインスタンス化するビューのたびにオブザーバーを削除する必要があります

これを実現するには、ビュー(アクティビティ、フラグメント)内でビューモデルをインスタンス化し、次のようなライブデータを観察する必要があります

val model = ViewModelProviders.of(this).get(MyViewModel::class.Java)
        model.getUsers().observe(this, Observer<List<User>>{ users ->
            // update UI
        })

thisを渡すことにより、ライブデータの監視をview'sライフサイクルなので、ビュー(アクティビティ、フラグメント)が破棄されると、ビューモデルとオブザーバーの両方が破棄されます。

0
Levon Petrosyan