Systrace显示performTraversals和getDisplayList需要很长时间

rst*_*ler 2 performance android systrace

我有一个gridView,一次在屏幕上显示20个自定义组件(作为网格视图项).滚动视图非常不稳定,我正在尝试确定原因.我的systrace(如下所示)显示了在performTraversals和getDisplayList(大约40ms)上花费了大量时间,但我不知道他们在做什么.我为onMeasure,onLayout和onDraw添加了自定义跟踪.相比之下,这些都很小.

我不知道下一步该去哪里确定一直在占用什么......

在此输入图像描述

rst*_*ler 5

所以这最终变得非常具体.问题是我需要在GridView滚动时使GridView中的项无效,因为它们是需要重绘自定义的自定义控件.从GridView OnScroll,我调用了GridView.invalidateViews().事实证明,这非常缓慢.我用以下内容替换它:

for(int visiblePosition = 0; visiblePosition <= mGridView.getLastVisiblePosition() - mGridView.getFirstVisiblePosition(); visiblePosition++) {
    mGridView.getChildAt(visiblePosition).invalidate();
}
Run Code Online (Sandbox Code Playgroud)

这个小循环比invalidateViews快得多.我没有查看代码来确定原因.

那么,我是如何确定这是问题的?所有这些花哨的工具都没有真正帮助.相反,我使用了一些很好的"时尚评论".我一直在削减滚动时发生的所有事情,这就是产生差异的线条.我的帧从大约50ms到大约8ms.