我有一个 gridView,一次在屏幕上显示 20 个自定义组件(作为网格视图项)。滚动视图非常不稳定,我正在尝试确定原因。我的 systrace(如下所示)显示了在 performTraversals 和 getDisplayList 上花费的大量时间(大约 40 毫秒),但我不知道他们在做什么。我为 onMeasure、onLayout 和 onDraw 添加了自定义跟踪。相比之下, 这些都是微不足道的。
我不确定下一步该去哪里确定一直在占用什么...
我有一个 gridView,一次在屏幕上显示 20 个自定义组件(作为网格视图项)。滚动视图非常不稳定,我正在尝试确定原因。我的 systrace(如下所示)显示了在 performTraversals 和 getDisplayList 上花费的大量时间(大约 40 毫秒),但我不知道他们在做什么。我为 onMeasure、onLayout 和 onDraw 添加了自定义跟踪。相比之下, 这些都是微不足道的。
我不确定下一步该去哪里确定一直在占用什么...
所以这最终变得非常具体。问题是我需要在 GridView 滚动时使 GridView 中的项目无效,因为它们是需要重绘自己的自定义控件。从 GridView OnScroll,我调用了 GridView.invalidateViews()。事实证明,这非常慢。我将其替换为以下内容:
for(int visiblePosition = 0; visiblePosition <= mGridView.getLastVisiblePosition() - mGridView.getFirstVisiblePosition(); visiblePosition++) {
mGridView.getChildAt(visiblePosition).invalidate();
}
这个小循环比 invalidateViews 快得多。我没有查看代码来确定原因。
那么,我如何确定这是问题所在?所有这些花哨的工具都没有真正的帮助。相反,我使用了一些不错的老式评论柔术。我一直在减少滚动时发生的所有事情,这就是产生差异的那一行。我的帧从 ~50ms 到 ~8ms。