查不到api就去源码里看看。在 Pager 类注释中有提到,每个 PagingData 代表支持分页数据的快照,数据刷新时应该提供一个新的 PagingData 实例,其实在各个教程中并没有提到该如何实现跳页功能,通过这段描述就可以想到跳页功能就需要提供一个新的 PagingData 实例。

那么 PagingData 实例是在什么时候提供的,在类 PageFetcher 中有具体的实现

val flow: Flow = channelFlow {

refreshChannel.asFlow()

.onStart {

//…

}

.scan(null) { previousGeneration: PageFetcherSnapshot?,

triggerRemoteRefresh ->

//…

PageFetcherSnapshot(

initialKey = initialKey,

pagingSource = pagingSource,

config = config,

retryFlow = retryChannel.asFlow(),

triggerRemoteRefresh = triggerRemoteRefresh,

remoteMediatorAccessor = remoteMediatorAccessor,

invalidate = this@PageFetcher::refresh

)

}

.filterNotNull()

.mapLatest { generation ->

PagingData(generation.pageEventFlow, PagerUiReceiver(generation, retryChannel))

}

.collect { send(it) }

}

可以看到在 flow 先是创建了分页快照,最后通过该对象的 pageEventFlow 和 一个 PagerUiReceiver 实例来创建了 PagingData 并发送出来供外部使用。此时可以再看 PageFetcherSnapshot 的 pageEventFlow,说实话里面太多协程内容,并看不太懂,但是能清楚 PagingSource 的 load 方法是在里面执行。

综合上面的线索,PagingData 能够通过触发刷新来提供,而刷新通过调用 PagingDataAdapter 的 refresh 方法,然后层层深入,最终通过 PagerUiReceiver 对象的 refresh 方法 调用 refreshChannel.offer(true)来触发(又是协程的东西…)。

接下来是页码的处理。在 PageFetcherSnapshot 的 pageEventFlow 中可以发现在触发刷新的时候会通过以下方法构建 LoadParams 并调用 PagingSource 的 load 方法加载数据。

//部分参数就是当初配置PagingConfig的数据,包括key也是构建Pager时传入的initialKey(默认值null)

private fun loadParams(loadType: LoadType, key: Key?) = LoadParams.create(

loadType = loadType,

key = key,

loadSize = if (loadType == REFRESH) config.initialLoadSize else config.pageSize,

placeholdersEnabled = config.enablePlaceholders,

pageSize = config.pageSize

)

也就是说需要跳页的时候只要触发刷新,然后在 PagingSource 的 load 方法中加载数据的时候使用个人期望的页码,而不是使用通过LoadParams带过来的初始页面的页码即可。

也就是说需要跳页的时候只要触发刷新,然后在 PagingSource 的 load 方法中加载数据的时候使用个人期望的页码,而不是使用通过LoadParams带过来的初始页面的页码即可。

坑点二、在界面不可见后一段时间切回来时会重新加载数据。

这点算不算是坑不知道,但是影响了APP的使用体验(因为监听了加载状态,所以每次切换回来的时候都会出现加载圈),所以必须排查一下。

首先想到的是不是因为 PageFetcher 的 refresh 方法被调用了。观察调用掉一个是 PagerUiReceiver 对象,专门提供给adapter那边的方法的。遂从 PageFetcherSnapshot 的调用点入手,经过几次调试发现整个刷新行为是因为PageFetcher的flow被重新构建,在继续往外扒最终发现是LiveData搞的鬼。但个人印象中哪怕页面出现切换,LiveData中的数据不发生变化的话也不会出现发送数据的情况。

有一点值得让人注意的是Paging3提供的对象是协程中的flow,最后是通过 asLiveData 方法转到 LiveData对象。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频 如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)

要如何成为Android架构师?

搭建自己的知识框架,全面提升自己的技术体系,并且往底层源码方向深入钻研。 大多数技术人喜欢用思维脑图来构建自己的知识体系,一目了然。这里给大家分享一份大厂主流的Android架构师技术体系,可以用来搭建自己的知识框架,或者查漏补缺;

对应这份技术大纲,我也整理了一套Android高级架构师完整系列的视频教程,主要针对3-5年Android开发经验以上,需要往高级架构师层次学习提升的同学,在这里点击GitHub免费分享,希望能帮你突破瓶颈,跳槽进大厂;

最后我必须强调几点:

1.搭建知识框架可不是说你整理好要学习的知识顺序,然后看一遍理解了能复制粘贴就够了,大多都是需要你自己读懂源码和原理,能自己手写出来的。 2.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要! 最后你达到什么水平取决你消化了多少知识 3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。

你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境

候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要! 最后你达到什么水平取决你消化了多少知识 3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。

你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: