Paging3返回MediatorResult.Success时RemoteMediator不工作如何解决
问题原因
- 核心问题出在RemoteMediator的APPEND/PREPEND逻辑的异常处理:首次REFRESH请求完成后,数据刚插入本地数据库,PagingState还未同步本地最新的分页数据,此时触发APPEND逻辑时,
getRemoteKeyForLastItem方法获取不到条目直接抛出InvalidObjectException,导致加载流程中断。 - 从你提供的loadState日志也能验证这个问题:本地数据源source的append状态已经标记为
endOfPaginationReached=true,但远程mediator的append状态还是endOfPaginationReached=false,说明本地已经读完现有数据,但远程加载流程因为异常中断没有拉取下一页。 - 次要原因可能是RxJava线程调度问题:PagingData提交到适配器需要在主线程执行,如果你没有主动切换到主线程,会导致UI层接收不到数据更新通知。
解决方案
- 修复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 }
- 补充RxJava主线程切换
Fragment中订阅PagingData的时候主动切换到主线程,确保适配器可以正常更新UI:
mDisposable.add( viewModel.getBarberTest() .observeOn(AndroidSchedulers.mainThread()) .subscribe { adapter.submitData(lifecycle, it) } )
- 校验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
相关产品推荐
相关产品推荐

