You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Paging3返回MediatorResult.Success时RemoteMediator不工作如何解决

问题原因

  • 核心问题出在RemoteMediator的APPEND/PREPEND逻辑的异常处理:首次REFRESH请求完成后,数据刚插入本地数据库,PagingState还未同步本地最新的分页数据,此时触发APPEND逻辑时,getRemoteKeyForLastItem方法获取不到条目直接抛出InvalidObjectException,导致加载流程中断。
  • 从你提供的loadState日志也能验证这个问题:本地数据源source的append状态已经标记为endOfPaginationReached=true,但远程mediator的append状态还是endOfPaginationReached=false,说明本地已经读完现有数据,但远程加载流程因为异常中断没有拉取下一页。
  • 次要原因可能是RxJava线程调度问题:PagingData提交到适配器需要在主线程执行,如果你没有主动切换到主线程,会导致UI层接收不到数据更新通知。

解决方案

  1. 修复RemoteMediator的异常抛出逻辑
    不要在获取不到RemoteKey的时候直接抛异常,改为返回无效页码终止本次加载,等待PagingState同步本地数据后会自动重试:
LoadType.APPEND -> {
    Log.d("RemoteMediator:", "APPEND")
    val remoteKeys = getRemoteKeyForLastItem(state)
    // 移除抛异常逻辑,拿不到key说明PagingState未更新,返回无效页即可
    remoteKeys?.nextKey ?: INVALID_PAGE
}

LoadType.PREPEND -> {
    Log.d("RemoteMediator:", "PREPEND")
    val remoteKeys = getRemoteKeyForFistItem(state)
    // 同样移除抛异常逻辑
    remoteKeys?.prevKey ?: INVALID_PAGE
}
  1. 补充RxJava主线程切换
    Fragment中订阅PagingData的时候主动切换到主线程,确保适配器可以正常更新UI:
mDisposable.add(
    viewModel.getBarberTest()
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe {
            adapter.submitData(lifecycle, it)
        }
)
  1. 校验PagingConfig配置
    构造Pager时确保参数配置合理,避免Paging提前终止加载:
Pager(
    config = PagingConfig(
        pageSize = 10, // 和服务端约定的每页返回数量保持一致
        initialLoadSize = 10, // 首次加载数量和pageSize对齐即可
        enablePlaceholders = false, // 关闭占位符,避免空页面显示问题
        prefetchDistance = 3 // 距离底部还有3条时触发下一页加载
    ),
    remoteMediator = BarberRxRemoteMediator(mainApi, barberDatabase),
    pagingSourceFactory = { barberDatabase.barberDao().selectAll() }
).observable

内容的提问来源于stack exchange,提问作者Vũ Hùng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:36:03