问题描述
从Paging 3的beta01
版本开始,当从RemoteMediator
刷新PagingData时,有时会发生刷新完成后仍然执行上一代的旧APPEND
请求.这似乎是从 this commit 读取的预期行为。
发生这种情况时,旧的 APPEND
请求会调用 RemoteMediator
的 load
方法,但使用过时的 PagingState
。如果我们在加载函数中使用其中的信息,这个过时的 PagingState
可能会导致错误和崩溃(例如,下面的代码片段使用 lastItemOrNull
在数据库)。发行说明中根本没有提到这一重大更改(也打破了 corresponding codelab)。我们应该如何处理这个问题?
这是一个以 RemoteKeys
中断的 RemoteMediator 示例。 beta01
方法可以返回 getRemoteKeyForLastItem
(因为旧的 null
正在寻找在前一个 PagingState
中删除的数据库条目)导致 REFRESH
抛出。
InvalidobjectException
解决方法
我与 Dustin Lam 和 Yigit Boyar 进行了交谈,显然,处理此问题的最佳方法是使 append 不依赖于 PagingState
。这意味着我们应该将远程键存储在与查询相关的表中,而不是在项目级别。
示例:
@Entity(tableName = "search_query_remote_keys")
data class SearchQueryRemoteKey(
@PrimaryKey val searchQuery: String,val nextPageKey: Int
)