Подкачка 3 — Используйте кэшированные данные только при отсутствии Интернета, в противном случае выполняйте запросы API

#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)  }  } }