Утечка памяти привязки данных - PullRequest
0 голосов
/ 14 января 2020

Есть ли вероятность, что этот метод в любом случае приведет к утечке памяти.

 android:onClick="@{(v) -> viewModel.showList(v)}

Насколько я понимаю, ссылка на представление передается для представления модели, затем модель представления использует ссылку и устанавливает ее содержимое для представления. На фрагменте уничтожить, связанный viewBinder также уничтожить, весь экран освобождается из памяти. Есть ли в любом случае переданная ссылка на представление, которая будет сохранена в модели представления после уничтожения фрагмента? Я так не думаю.

Вы рекомендуете использовать эту запись? Можете ли вы поделиться своим опытом, если это возможность утечки памяти?

1 Ответ

3 голосов
/ 15 января 2020

Это может быть утечка памяти в данном сценарии:

Допустим, вы нажимаете на представление, и этот метод viewModel.showList(v) вызывается вместе с ссылкой на представление, переданной ему.

Теперь представьте, что вы Глобальная переменная globalViewRef в ViewModel, в которой хранится ссылка на это представление, например:

class MyViewModel: ViewModel(){

    lateinit var globalViewRef: View

    fun showList(v: View){
        globalViewRef = v // Storing view reference globally for future methods/purpose etc.
    }
}

И ваш ViewModel распределяется между фрагментами с активностью контекст, в таком случае, если изменение конфигурации произойдет, ваша viewModel утечка объект глобального обзора из-за изменения контекста.


Итак, все принять во внимание:

  1. Никогда не храните view/context глобально в ViewModel классе (используйте его локально внутри метода только при необходимости) .

  2. Если что-то вам не нужно хранить глобально, переопределите onCleared() и очистите ссылку, так как это последний вызов ViewModel, когда он собирается уничтожить состояние (Учтите это, когда ViewModel не передается в контексте действия) .

Если вы рассмотрели обе вещи, то в вашем случае нет утечки памяти, которую я могу найти.

...