1

我正在按照这个codelab构建一个带有 github API 和本地数据库的 paging3 应用程序。虽然前 2 个页面加载正常,但当滚动到底部时尝试加载第 3 个页面时,中介会遇到循环 - 相同的 PagingState 一遍又一遍地传递给 load() 函数。

只是想知道是否有人知道这里可能的根本原因是什么?

一些实现细节:

RemoteMediator:(prevPage 和 currentPage 来自 github API 的分页响应头并保存到本地 DB。)

// RepositoryMediator
override suspend fun load(
    loadType: LoadType,
    state: PagingState<Int, Repository>
): MediatorResult {
    return when (loadType) {
        LoadType.REFRESH -> {
            fireRequestForPage(1, true /*clear DB*/)
            return Success(endOfPaginationReached = false)
        }

        LoadType.APPEND -> {
            // !!!!!!! kept getting the same state when APPEND is triggered, resulting in same currentPage and nextPage
            // get currentPage, nextPage from state.lastItemOrNull
            if(currentPage < nextPage) {
              fireRequestForPage(nextPage)
              Success(endOfPaginationReached = false)
            } else {
              return Success(endOfPaginationReached = true)
            }
        LoadType.PREPEND -> {
            // get currentPage, prevPage from state.firstItemOrNull
            if(currentPage > prevPage) {
              fireRequestForPage(prevPage)
              Success(endOfPaginationReached = false)
            } else {
              return Success(endOfPaginationReached = true)
            }
        }
    }
}

可观察的:我正在使用liveData而不是flow来自Pager

fun searchRepositoryWithUserId(userLoginName: String): LiveData<PagingData<Repository>> {
    // need to create a new Pager each time because the search query is different
    return Pager(
        config = PagingConfig(pageSize = PAGE_SIZE, enablePlaceholders = false),
        remoteMediator = RepositoryMediator()
    ) {
        repoDao().getRepositoriesOfUser(userLoginName)
    }.liveData
}

:只是一个简单的查询

@Query("SELECT * FROM repository_table WHERE login = :ownerLoginName")
fun getRepositoriesOfUser(ownerLoginName: String): PagingSource<Int, Repository>
4

2 回答 2

3

对于任何感兴趣的人,修复来自 Dao,需要更新查询以对 reponame 进行排序,否则即使有新项目插入 DB,查询也会为 PagingSource 返回相同的最后一页,从而使中介者感到困惑。

@Query("SELECT * FROM repository_table WHERE login = :ownerLoginName ORDER BY repository_name ASC")
fun getRepositoriesOfUser(ownerLoginName: String): PagingSource<Int, Repository>
于 2021-01-07T07:47:48.623 回答
0

刚才也有类似的问题。尝试按不同字段排序导致 RemoteMediator 陷入不同页码的循环中。

原来我不能依赖后端分配的项目 ID 作为我的房间数据库实体的主键。在本地分配主键 ID(从零开始)似乎已经解决了这个问题。

于 2021-10-14T17:31:01.683 回答