Проблема
Имеется экран настроек (SettingsActivity
) с примерно 10 текстовыми полями и 3 кнопками. Содержимое текстовых полей, которые onClick
открывают диалоговое окно для вставки/редактирования текста, сохраняется в файле SharedPreferences
. Кнопки выполняют асинхронные запросы для извлечения содержимого и сохранения в другом месте. Во время запросов отображается диалоговое окно для уведомления о ходе выполнения.
Исходное решение
Репозиторий данных
В основном оболочка для SharedPreferences, которая имеет 10 геттеров и 10 сеттеров, по одному для каждого поля. В get[field_name]
DataRepository
получает значение из SharedPreferences
, а в set[field_name]
оно фиксируется в SharedPreferences
.
ViewModel
ViewModel
, который имеет 10 объектов MutableLiveData
, по одному для каждого поля. Этот класс реализует LifecycleObserver
, чтобы знать о жизненном цикле SettingsActivity
, чтобы он мог загружать поля из репозитория в onCreate
и сохранять поля в репозиторий в onDestroy
.
Есть также 3 метода для выполнения 3 асинхронных запросов, которые запускаются 3 упомянутыми кнопками. Каждый метод получает экземпляр OnRequestProgressListener
, который передается классу, который делает асинхронный запрос, который будет использоваться для уведомления представления о ходе выполнения.
Вид
Активность с 10 полями, которая наблюдает за 10 MutableLiveData
из ViewModel
. На onClick
каждого поля открывается диалоговое окно для редактирования/вставки текста. На onPositiveButton
диалога вызывается наблюдатель соответствующего поля.
Активность реализует OnRequestProgressListener
для отображения и скрытия диалогов в соответствии с ходом выполнения асинхронных запросов.
Начальная задача решения
Описанная выше конструкция не кажется правильной. Могу отметить некоторые:
- 10
MutableLiveData
вViewModel
; - 10 геттеров и 10 сеттеров в
DataRepository
; - Репозиторий для
SharedPreferences
. ViewModel
получает слушателей для передачи классам, выполняющим асинхронные запросы, которые используют этих слушателей для уведомления представления. Все сViewModel
посередине.
Правильное решение
Это правильное решение? Если нет, а я считаю, что это не так, как следует разработать правильное решение?