#android #android-room #android-paging #android-paging-3
Вопрос:
Я пытался использовать RemoteMediator
для извлечения данных из API и кэширования ответа, и в целом это отлично работает.
Мне нужно что-то немного отличное от обычного поведения. по умолчанию кажется, что он сначала автоматически извлекает кэшированные данные (из комнаты) и только когда он достигает конца списка, выполняет другой запрос. Чтобы убедиться, что вы получаете свежие данные, я увидел в документах, что мне нужно очищать кэшированные данные каждый раз, когда пользователь выполняет новый поиск (чтобы аннулировать поток и обновить список RecyclerView).
Что я хочу сделать, так это всегда выполнять запрос API (если у пользователя есть Интернет) и использовать кэшированные данные только в том случае, если у него нет подключения к Интернету (кэшированные данные должны сохраняться, поэтому я не могу удалить их, потому что мне нужно использовать их в качестве внешнего ключа с другими объектами в базе данных).
Любые предложения приветствуются. Спасибо!
Ответ №1:
Все элементы, загруженные и представленные с помощью подкачки, полностью зависят от PagingSource
. В этом сценарии вы можете просто отложить удаление кэшированных данных до тех пор, пока ваш сетевой запрос не будет выполнен успешно, и только тогда удалите запишите новые данные.
Напр.,
class MyRemoteMediator(...) : RemoteMediatorlt;Int, ...gt;() { override suspend fun load( loadType: LoadType, state: PagingStatelt;Int, RedditPostgt; ): MediatorResult { try { val items = networkApi.fetchItems(..) db.withTransaction { if (loadType == REFRESH) { // Clear cache } // Insert items into cache // Now call .invalidate() } return MediatorResult.Success(...) } catch (e: IOException) { return MediatorResult.Error(e) } } }