Android вызывает метод View Controller из ViewModel - PullRequest
0 голосов
/ 10 декабря 2018

Я начал играть с Android JetPack (ViewModel, Компоненты архитектуры, LIfeCycle и так далее).До сих пор я работал с архитектурой Model View Presenter, и на самом деле я обнаружил, что довольно легко тестировать и поддерживать архитектуру.

С другой стороны, большое преимущество, которое я вижу, используя вместо этого ViewModels, заключается в ихродная связь с жизненным циклом «Деятельности» и «Фрагменты», которая всегда была одной из самых больших проблем для разработчика Android, поэтому я думаю, что это очень большой шаг вперед.

Сказав, что, я думаю, есть большое разочарование:В этом новом подходе кажется гораздо сложнее вызывать методы Activity или Fragment, потому что, как указано в официальных документах

ViewModel никогда не должна ссылаться на представление, жизненный цикл или любой класс, который может содержатьссылка на контекст действия.

В подходе MVP Presenter имел контракт с представлением и мог вызывать все его методы.Я провел некоторое исследование о том, как решить этот сценарий с помощью компонентов Архитектуры, но кажется, что нет простого и безболезненного способа сделать это: в конце вы всегда должны обрабатывать состояния в ViewModel и реагировать на эти изменения в Деятельности и Фрагментах.Кто-то предлагает использовать SingleLiveEvent класс, который делает его немного легче, но все же намного более болезненным, чем раньше.

Поэтому мой вопрос:

В документах говорится, что выне может ссылаться на что-либо, содержащее ссылку на Контекст Деятельности (я полагаю, чтобы избежать утечек памяти), но что, если я сделаю это, и тогда я очищу все ссылки в onCleared () ViewModel?

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Я могу придумать пару способов «уведомить пользователя» об ViewModel:

  1. A LiveData, который изменяется и Observer к этим данным
  2. Отправьте Broadcast на BroadcastReceiver, используя Context приложения, если вы не против статического доступа к нему с ViewModel

Редактировать: Я знаю, что это не совсем ответ на вопрос, но я думаю, что это избавило от необходимости

0 голосов
/ 23 декабря 2018

но что, если я сделаю это, и тогда я очищу все ссылки в onCleared () ViewModel?

Это слишком поздно.onCleared() вызывается только в том случае, если действие завершено / фрагмент удален, оно не вызывается при изменениях конфигурации.


Но вы потенциально можете использовать некоторую форму очереди команд для отправки событий только тогда, когдаподписчик доступен, например, DispatchWorkSubject в RxJava2-Extensions .

Просто убедитесь, что вы делаете свои подписки в onStart, а затем утилизируете свои одноразовые в onStop.

0 голосов
/ 10 декабря 2018

Вы не избежите утечек памяти, потому что, например, если вы поверните свое устройство, ваше activity будет уничтожено, а затем воссоздано, но VM останется прежним, и onCleared не будет вызвано (следовательно, ваша старая деятельность все еще остается в памяти, поскольку ваша VM все еще ссылается на нее).

Обычно MVVM концептуально говорит, что ViewModels не должен знать о View, и в этом вся прелесть архитектура : не существует лучшего паттерна , просто есть более подходящий , и вы должны выбрать тот, который лучше работает для вас.

...