gpt4 book ai didi

android - 快速 throw 期间的 RecyclerView ANR

转载 作者:行者123 更新时间:2023-12-05 05:45:47 27 4
gpt4 key购买 nike

我有一个带有列表适配器的 RecyclerView (1.2.1) 和由 Room PagingSource 支持的 ViewHolder。 list 上大约有 700 项。分页似乎工作正常,我已经尽可能地展平了我的 View 层次结构。

最初加载回收站 View 时,一切似乎都很好。寻呼有效,一切看起来都很活泼。 onCreateViewHolder 在我的适配器中被调用了 14 次,最初有 5 次在屏幕上可见。

较慢的滚动没问题(它调用 onCreateViewHolder 的频率比我预期的要高,但没有卡顿)。

当快速浏览列表时,问题就来了。经过 3-5 次快速扫描后,它似乎决定需要更多的缓存 View 持有者,并且对 onCreateViewHolder 进行了很多很多次调用 - 此方法的计时时间约为 5 毫秒,但也有太多其中很多,滚动停止。它似乎调用了 onCreateViewHolder ~700 次 - 与列表中的项目数相同,就像它根本没有回收 View 一样。

到那时,有时应用程序会恢复,那时一切都很顺利,似乎不需要创建更多的 ViewHolder。但是有时我会收到 ANR 对话框。

我已经尝试调整 recyclerView.recycledViewPool.setMaxRecycledViews(),但这似乎不会增加 recycledViewCount,直到 大量 onCreateViewHolder 调用。

我能做些什么来解决这个问题吗?让 throw 速度变慢?以某种方式调整 View 持有者回收,使其不会发疯并尝试一次创建这么多?

鉴于我的设计和数据限制,我认为我无法更好地实现布局膨胀。即使我可以,它仍然创造了太多的东西,无法在 16 毫秒内完成它们!

最佳答案

在我的情况下,我需要做两件事。首先,我需要调整分页配置。我的 prefetchDistance 相对于我的页面大小来说太小了!这摆脱了 ANR——不再大量创建 ViewHolders!

recyclerView 在加载页面时仍会暂停滚动(尤其是接近尾声时)。我添加了一个 loadStateFlow 收集器来处理显示加载指示器,以便用户知道有更多数据即将到来。

关于android - 快速 throw 期间的 RecyclerView ANR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71296782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com