Имейте в виду, что WM (диспетчер работ) предназначен для выполнения операций при соблюдении определенных условий (например: у пользователя достаточно батареи, дисплей выключен и т. Д.). Таким образом, это может привести к тому, что ваши данные не будут обновляться, когда вам это нужно. WM хорош для операций, которые вы хотите выполнить, но не являются критичными для выполнения прямо сейчас. Я бы сказал, что всегда используйте Room DB как единственный источник истины. Если данные в комнате, покажите их, если нет, принесите, если не можете, ну, вы пробовали. Отправьте сообщение пользователю. Вы можете использовать NetworkConnectivityListener
для мониторинга подключения и проверки наличия ожидающего запроса (вы можете сохранить параметры этого запроса в своей базе данных Room в другой таблице для простоты использования). Таким образом, вы должны запросить БД, получить ожидающие запросы (если есть) и выполнить их, обновить данные и позволить ViewModel / Repository решить, есть ли контекст для отображения этих данных (UI).
Я чувствую, что вы очень близки к достижению того, что вам нужно.
Другими словами:
UI: наблюдает за своим viewModel для некоторого sealed class xxx
состояния, чтобы сообщить ему, что делать (показать пустой список, показать ошибку, передать данные адаптеру recyclerview и т. Д.).
ViewModel: использование viewModelScope.launch { ... }
вызовет repository.fetch(...)
или аналогичный. Ваш viewModel будет извлекать эти данные, когда фрагмент сообщает ему об этом (например, пользователь нажал кнопку) или при каком-либо событии жизненного цикла (например, onStart).
Репозиторий в этом случае обычно предоставляет flow
(если вы можете использовать экспериментальный api) или функцию приостановки, которая может выполнять следующие действия (которые могут варьироваться в зависимости от ваших бизнес-правил)
- Если данные доступны в базе данных, немедленно верните их.
- Если данные старые (или мы все еще хотим их обновить), выполните сетевой API (если для этого есть возможность подключения). Если нет подключения, вы можете сохранить этот ожидающий запрос в базе данных на будущее. Вы также можете проверить, есть ли у вас ожидающий запрос, прежде чем делать что-либо, возможно, он устарел или, возможно, вам нужно его выполнить.
- В любом случае после выполнения запроса вы вставляете результаты в базу данных и вызываете тот же метод, который использовали на шаге 1.
- Не забудьте обновить ожидающий запрос, если он у вас был (или если вы его используете).
С помощью WorkManager вы можете запланировать получение данных из части API в какой-то момент (так что ваши данные будут обновляться), но все действительно зависит от ваших вариантов использования.
person
Martin Marconcini
schedule
23.02.2021