Android MVVM + Databinding, содержит ли следующий код ссылку на View / Activity / Context, вызывающую утечку?

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

В каких случаях ViewModel может привести к утечке или, возможно, игнорировать использование MVVM? (Пожалуйста, порекомендуйте надежные проекты MVVM для рассмотрения, если это возможно)

import ....View;     //Question 1
import ....Activity;

public class MyViewModel extends ViewModel {

    // Question 2
    public void viewClicked(View v){
        ((TextView)v).setText("Clicked")
    }
}

В каком-то layout.xml

<layout>

    <import "android.app.Activity"/>  //Question 3

    <variable
        name="viewModel"
        type="MyViewModel"/>

    <TextView  // Question 4
        ....
        ....
        android:onClick='@{viewModel::viewClicked}'/>

    <Button  //Question 5
        android:id="@+id/btnBack"
        ....
        ....
        android:onClick='@{() -> ((Activity)btnBack.getContext()).finish()}'/>

</layout>

Вопрос 1: вызывают ли операторы импорта Activity утечку памяти?

Вопрос 2: Почему метод viewClicked не рекомендуется в ViewModel, когда он помогает в View Handling.

Вопросы 2.1: Это знание Java 101, но все же. Заставляет ли метод ViewModel с аргументом View в качестве целого ViewModel содержать ссылку на View / Context, поскольку люди более агрессивны в отношении методов такого типа.

Вопрос 3: Может ли импорт Activity в XML привязки данных вызвать проблемы?

Вопрос 4: Если не в viewmodel, где должна быть размещена логика кликов в Databinding в MVVM?

Вопрос 5: Если вы сделаете это (см. Button onClick), так как вы можете просто вызвать метод finish прямо из XML, когда вы знаете, что кнопка «назад» всегда прерывает активность.

Всего 1 ответ


1) Оператор импорта в коде сам по себе ничего не делает. Для компилятора это просто способ разрешения пространств имен классов. JVM не будет действительно загружать импортированный класс в память, если на класс не ссылается код.

2) Класс ViewModel предназначен для хранения наблюдаемых данных, которые имеют отношение к визуализации вашего пользовательского интерфейса. Его данные должны отслеживаться пользовательским интерфейсом (например, через привязку данных ), но сами по себе не должны иметь прямых ссылок на конкретные виджеты и представления, которые его составляют. В общем, ViewModel вообще не должен иметь ссылок на класс Android.

2.1) Любая ссылка на View содержит ссылку на окружающий контекст / Activity. Вот почему, в целом, плохая практика - хранить ссылку на представление в любом фрагменте кода, который может превышать жизненный цикл действия (например, нестатические AsyncTasks, обратные вызовы фоновых потоков и т. Д.). Я полагаю, что существует особая проверка, которая запрещает удерживать Views в ViewModels.

3) 4) 5) Не импортируйте само действие, но не по причинам утечки памяти. Ваши взгляды в идеале должны просто наблюдать за моделями представления. Посмотрите на эту кодовую метку, чтобы ViewModels реагировали на события. Если вам нужно вызвать методы Activity, помните, что ваши Activity также могут наблюдать ViewModels.


Есть идеи?

10000