Обложка канала

Android Broadcast

Качественная выборка Android Dev новостей, тезисы важных новостей и статей, личное мнение

Android Broadcast

7 лет назад
Открыть в
#Architecture #ViewModel #MVVM #ArchComponents

MVVM — How View and ViewModel should communicate?

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

На текущий момент очень популярным решением стало MVVM (Model-View-ViewModel). Рост спроса на эту архитектуру подкрепился тем, что разработчики из Google сделали готовые компоненты для удобной реализации этого подхода, что значительно упрощает задачу.

Замечание: классический MVVM, описанный в Microsoft, отличается от того что обычно применяется в Android

Чтобы сделать MVVM качественно надо придерживаться нескольких правил:
👉 У каждого компонента есть четкая роль: View отвечает за отображение данных, VM - предоставляет данные, которые отобразятся на View и обрабатывает события, связанные с данными в ней
👉 VM содержит только логику. Он не должен содержать никаких классов из Android SDK, все платформенное API должно предоставляться через абстракции в виде интерфейсов.
👉 Когда происходит клик или прочие события на UI, View только сообщается VM о произошедшем событие (простым вызовом метода в VM) и не выполняет какой-либо логики
👉 VM не знает ничего о View
👉 При модификации данных в VM они сразу же должны отображаться в View. Эффективный способ достичь этого - использовать LiveData. Это позволяет организовать push взаимодействие между VM и View, что дает мгновенное отображение любых изменений в данных на экране.
👉 ViewModel может предоставлять дополнительные методы для View. В случаях когда у вас много логики в VM можно вынести ее в отдельный класс - Presenter, который служит медиатором между VM. В таком случае VM будет служить чистым контейнером состояния View.

Следование правилам, описанным выше, позволит вам:
👉 реализовать эффективную архитектуру в Android
👉 не иметь проблем с жизненным циклом
👉 не думать о сохранение данных при повороте экрана
👉 позволит покрыть логику Unit тестами
👉 упростит расширение функционала в будущем