但实际上,AndroidX 分页库如何知道何时加载更多页面?

But really, how does the AndroidX Paging Library know when to load more pages?

题,措辞相同

但是张贴者的问题在没有真正回答张贴的问题的情况下得到了解决 - 因为问题是由于与分页库如何知道加载更多页面无关的原因引起的。

我想知道用于使用 Paging 数据源的 subscription/collection (Rx/Flow) 机制是否是 Paging 数据源知道何时加载更多页面的方式。所以也许 subscription/collection 拉页面。 (但即便如此,初始加载后的页面将如何被触发?) 并且数据源可以使用拉取事件作为检查它是否需要加载更多页面的机会。

我只是在猜测,因为我不知道这一切在内部是如何运作的。

我希望有人能证实或否定我的猜测,并提供有关所涉及机制的更多细节。特别是,当页面作为 Flow 或 (Rx) Flowable 公开时。

Paging 3 库中有很多代码,我非常想避免仔细查看它。

但我做了一些肤浅的探索,发现了一个可能的候选人来解释用户滚动如何触发丢失页面的负载。

正如我在问题中推测的那样,加载不是由 subscription/collection (Rx/Flow) 页的 activity 触发的。

适配器尝试获取要显示的项目会触发对
的调用 PagingDataDiffer<T : Any>.get(@IntRange(from = 0) index: Int): T?.

它的 Javadoc:

Returns the presented item at the specified position, notifying Paging of the item access to trigger any loads necessary to fulfill prefetchDistance.

Params: index - Index of the presented item to return, including placeholders.

Returns: The presented item at position index, null if it is a placeholder.

特别感兴趣: ... notifying Paging of the item access to trigger any loads necessary to fulfill prefetchDistance.

所以,我们有它。

如果其他人不同意或希望详细说明该机制,请这样做。

演示者 API 的 .get(index) 调用触发了对 Paging 其余部分的项目访问。通常,您需要调用此函数才能将项目绑定到 RecyclerView.Adapter,但 Leanback 和 Compose 的工作方式类似。

在访问项目时,会发送一个名为 ViewportHint 的内部对象,其中包含演示者状态,包括您可以看到的项目数 post-转换以及您在列表中的当前位置,可以是从 UI.

的其余部分异步处理

然后,分页本质上会触发基于 PagingConfig.prefetchDistance 的加载,但有很多逻辑处理竞争条件、访问合并、取消、跟踪加载状态、错误处理等,所有这些都会影响最终得到的内容加载到最后。

如果您想访问但避免触发加载,.peek().snapshot() API 可以让您在不获取的情况下检查演示者状态。