Публикация в LiveData из Coroutine для обновления пользовательского интерфейса, даже если LiveData будет обновляться только один раз - PullRequest
1 голос
/ 19 марта 2020

В конструкторе моего ViewModel я немедленно запускаю сопрограмму для одноразового сетевого вызова. Чтобы обновить пользовательский интерфейс на основе результатов этого сетевого вызова, я публикую обновления для нескольких переменных LiveData в моей ViewModel. Эти переменные LiveData, в свою очередь, наблюдаются фрагментом, который затем производит необходимые обновления пользовательского интерфейса.

Что мне интересно, так это допустимый способ обновления пользовательского интерфейса из сопрограммы. Как я упоминал ранее, сетевой запрос выполняется только один раз при инициализации, поэтому переменные LiveData никогда не будут обновляться более одного раза. Тогда расточительно ли устанавливать наблюдателей в моем фрагменте, поскольку я точно знаю, что они будут вызваны только один раз? Если так, что может быть лучше для этого?

Спасибо!

1 Ответ

1 голос
/ 19 марта 2020

Тогда расточительно ли устанавливать наблюдателей в моем фрагменте, поскольку я точно знаю, что они будут вызваны только один раз?

Они могут быть вызваны более одного раза.

Прежде всего, LiveData является держателем стоимости. И, в частности, имея LiveData в ViewModel, вы сохраняете LiveData и удерживаемые значения при изменениях конфигурации (поворот экрана, переключение темного режима и т. Д. c.).

поток может закончиться так:

  • Ваш фрагмент создан
  • Ваша модель представления создана, и вы запускаете сетевой ввод / вывод
  • Ваш фрагмент создает его экземпляр UI
  • Ваш фрагмент соответствует LiveData
  • Ваша сопрограмма завершается, и ваша модель просмотра обновляет LiveData
  • Ваш фрагмент получает значение из LiveData и обновляет UI
  • Пользователь крутит ее запястье и поворачивает экран
  • Ваш фрагмент уничтожен
  • Ваш замещающий фрагмент создан
  • Ваша модель представления сохраняется , и ваш замещающий фрагмент получает ту же модель представления с той же LiveData
  • Ваш замещающий фрагмент создает свой пользовательский интерфейс
  • Ваш заменяющий фрагмент наблюдает за LiveData
  • Ваша замена фра gment получает значение из LiveData и обновляет пользовательский интерфейс

Итак, то, что вы описываете, в целом разумно.

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