Этот вопрос касается лучших практик программирования для Android с использованием MVVM, LiveData, Room (и, следовательно, RetroFit) и сопрограмм. Одна из лучших практик гласит, что
Длительные операции, такие как вызовы сети или базы данных, должны выполняться асинхронно из потока пользовательского интерфейса.
Текущая документация и блоги подробно объясняют, как это сделать с помощью совместных подпрограмм, и некоторые примеры прекрасно это демонстрируют, например Подсолнечное приложение.
Часть, которую мне не хватает, - это когда ViewModel инициализируется, и ему нужно показать контент из базы данных / репозитория / сети, как выполняется загрузка с использованием совместных подпрограмм. В Sunflower App репозиторий возвращает LiveData, но совместные подпрограммы не используются.
Пример:
В PlantDao
мы видим:
@Query("SELECT * FROM plants WHERE id = :plantId")
fun getPlant(plantId: String): LiveData<Plant>
Следовательно, ключевого слова suspend
нет, это не часть совместной процедуры.
В plantRepository
есть:
fun getPlant(plantId: String) = plantDao.getPlant(plantId)
Снова нет ключевого слова suspend
, поэтому нет совместной процедуры.
В PlantDetailViewModel
инициализация показывает нам
val plant = plantRepository.getPlant(plantId)
Так что никакой области действия, работы или каких-либо сопутствующих рутинных вещей.
Мои вопросы:
- Помещение выполняет асинхронный запрос к БД? И если да, то используются ли совместные подпрограммы?
- Это хорошая практика? Поскольку репо возвращает только LiveData и может использоваться только для возврата LiveData
- Какие еще стратегии для этого есть? Есть примеры?
- Будет ли эта стратегия отличаться для сетевых запросов?