其他分享
首页 > 其他分享> > android – onMeasure被称为1500次

android – onMeasure被称为1500次

作者:互联网

我最近发现我的应用程序出现了严重的性能问题.我基本上有以下布局……

描述
简而言之,有一个ViewPager将3个RelativeLayouts保存为页面.每个页面内都有许多TextView.我最近注意到当我输入EditText时会出现很多延迟,在EditText上有一个TextWatcher来执行自动完成的快速SQL查询.当我输入文本时,我的HTC One M8口吃和滞后,但我知道这不是查询速度慢,因为我测量的查询只花了大约7毫秒.

我使用了方法分析,Systrace和普通的旧Log调试,并得出结论,每次我在EditText中输入一个字符时,在RelativeLayout A,B和C中的TextViews上大约有1,700个对onMeasure的调用.累计,只有大约跨页面15个独立的TextView.我注意到每个onMeasure被调用了数百次,而不是像往常一样被调用一次或两次.


我不知道为什么在页面B中输入EditText会导致页面A和C中的其他TextView也被“重新测量”.更重要的是,有没有人有关于为什么经常调用onMeasure的见解?并且,有没有人知道一个显着减少onMeasure调用次数的解决方案?

细节
这可能有所帮助:我实际上能够通过删除RelativeLayout 2将onMeasure调用的数量减少到大约900,这可能表明onMeasure调用的传播在ViewPager之外开始.

解决方法:

虽然我没有足够的信息来确定具体问题,但总的来说,我可以告诉你发生了什么:

调用根视图的度量会导致调用每个子视图的度量,依此类推,在树下.

假设名为“当前视图”的视图在询问每个子视图以自我测量之后,确定没有足够的空间供所有子项使用.它将要求他们每个人再次测量自己,建议最大尺寸.那么,假设名为“相对布局B”的视图根据指定的最大值从根本上改变其大小.因为变化太大,“当前观点”必须再次询问每个孩子.此循环可能很容易需要多次迭代才能解决.

当“当前视图”决定其大小时,它会向“查看寻呼机”报告.假设“View Pager”没有足够的空间用于其三个视图,并且必须要求他们重新测量,最大值.我们现在至少有20次调用TextView的onMeasure.如果ViewPager上面的每个其他视图都会迭代几次,很快就会看到大数字.

正如您已经指出的,最好的解决方案是减少树的深度.或者,您可以使用具有更简单的测量算法的布局管理器(FrameLayout,LinearLayout)

1500虽然很多.其中一种观点是做一些奇怪的事情.您应该能够使用DDMS套件中的TreeView工具非常简单地识别它.在eclipse中,它被称为“TreeView”.在Studio中,单击Android图标并切换到“层次结构视图”透视图.您也可以从SDK工具目录的命令行运行它.

添加:
如果您在应用程序运行时将Hierarchy Viewer连接到应用程序,您将在其中一个窗格中看到整个视图树.树中的每个节点都有三个朝向底部的彩色橡皮糖.第一个胶基糖代表测量阶段.如果胶基糖是绿色的,那么该视图的测量阶段很快.如果它是黄色,则该节点位于布局中节点的前50%.如果它是红色,则它是布局中最慢的.

你应该可以沿着黄色的痕迹跟踪违规视图.

标签:android,android-layout,android-viewpager,textview,onmeasure
来源: https://codeday.me/bug/20190728/1561554.html