分页 3 - 仅在没有互联网时使用缓存数据,否则执行 API 请求

Posted

技术标签:

【中文标题】分页 3 - 仅在没有互联网时使用缓存数据,否则执行 API 请求【英文标题】:Paging 3 - Use cached data only if no internet, else do API requests 【发布时间】:2021-12-27 11:27:17 【问题描述】:

我尝试使用RemoteMediator 从 API 获取数据并缓存响应,通常效果很好。

我需要一些不同于正常行为的东西。默认情况下,它似乎首先(从房间)自动获取缓存数据,并且只有当它到达列表末尾时,它才会执行另一个请求。为了确保您获得新数据,我在文档中看到,每次用户进行新搜索时,我都必须清除缓存数据(以使流程无效并更新 RecyclerView 的列表)。

我想要做的是始终执行 API 请求(如果用户有互联网),并且只有在他没有互联网连接时才使用缓存数据(缓存数据需要持久化,所以我可以'不要删除它,因为我需要将它用作数据库中其他实体的外键)。

感谢任何建议。谢谢!

【问题讨论】:

【参考方案1】:

Paging 加载和呈现的所有项目完全由PagingSource 驱动。在这种情况下,您可以推迟删除缓存数据,直到您的网络请求成功,然后才删除 + 写入新数据。

例如,

class MyRemoteMediator(...) : RemoteMediator<Int, ...>() 
    override suspend fun load(
        loadType: LoadType,
        state: PagingState<Int, RedditPost>
    ): 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)
        
    

【讨论】:

以上是关于分页 3 - 仅在没有互联网时使用缓存数据,否则执行 API 请求的主要内容,如果未能解决你的问题,请参考以下文章

仅在滚动(分页)后显示的数据是不是是加载页面时 dom 的一部分?

分页库仅在房间数据库中存储第一次获取的值

RestKit - 仅在第二次调用时将缓存保存到核心数据

从 Chrome 打印时仅在 tbody 之间分页

Django基础---web框架 和 django 介绍3 --model --form---跨站请求---cookie--session--分页--缓存--信号

仅在 Angular SPA 中的页面加载之间缓存会话数据