Android MVVM + Databinding, содержит ли следующий код ссылку на View / Activity / Context, вызывающую утечку? - PullRequest
0 голосов
/ 15 мая 2019

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

В каких случаях 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, когда он помогает в обработке изображений.

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

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

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

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

1 Ответ

0 голосов
/ 16 мая 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...