Рассмотрим архитектуру приложения Android, рекомендованную Google: https://developer.android.com/jetpack/docs/guide
Эта архитектура основана на ViewModel и Observables, поэтому я бы отнес ее к категории "Model-View-ViewModel" (MVVM) архитектура.
Это очень отличается от React-Redux. В то время как архитектура Android поддерживает двунаправленные потоки данных между Views и ViewModels, Redux обеспечивает однонаправленный поток данных в круге. Более того, архитектура Android поддерживает состояние в нескольких моделях ViewModels, тогда как Redux обеспечивает централизованное хранилище.
Теперь мой вопрос состоит в том, как реализовать Redux с собственными библиотеками Android. Моя первая попытка будет:
- Реализация централизованного хранилища как Kotlin Singleton-объекта.
- Хранилище предоставляет
sendAction
-метод, который выполняет действие, помещает его в очередь, а затем быстро возвращается. - Действия являются чистыми Kotlin классами данных, поскольку они не должны содержать лог c.
- В хранилище реализовать Kotlin -Программу, которая выбирает действия из очереди и отправляет их с помощью огромного оператора switch.
- Используйте базу данных Room + некоторое эфемерное состояние в качестве модели. В частности, эфемерное состояние контролирует, какой фрагмент / диалог отображается в любой момент времени.
- Убедитесь, что состояние изменяется только сопрограммой.
- Используйте наблюдаемые жизненные данные (
androidx.lifecycle.LiveData
) для повторного рендеринга пользовательского интерфейса при изменении базы данных комнаты или эфемерного состояния. - Поскольку наблюдаемых недостаточно для управления пользовательским интерфейсом Android, мне также понадобится функция, которая сравнивает текущий фрагмент / активность с ожидаемым состоянием и, например, запускает транзакцию FragmentManager, если обнаружено отклонение.
Однако некоторые моменты не ясны:
Как сохранить активность / фрагменты в синхронизации c с глобальным состоянием? Возможно, я бы использовал одно действие и заменил фрагменты по мере необходимости, в зависимости от текущего состояния магазина.
Как я могу реализовать обе асинхронные c + диспетчеризацию последовательных действий? Возможно, я бы реализовал единственную подпрограмму Kotlin, которая собирает входящие действия из очереди и отправляет их прямо в поток пользовательского интерфейса.
Как мы можем гарантировать, что весь пользовательский интерфейс перезаписывается перед отправкой новых действий? Возможно, я остановлю диспетчеризирующую сопрограмму, пока в очереди потока пользовательского интерфейса больше не будет других исполняемых объектов?