android – onMeasure被称为1500次

android – onMeasure被称为1500次,第1张

概述我最近发现我的应用程序出现了严重的性能问题.我基本上有以下布局…… 描述 简而言之,有一个ViewPager将3个RelativeLayouts保存为页面.每个页面内都有许多TextView.我最近注意到当我输入EditText时会出现很多延迟,在EditText上有一个TextWatcher来执行自动完成的快速SQL查询.当我输入文本时,我的HTC One M8口吃和滞后,但我知道这不是查询速度 我最近发现我的应用程序出现了严重的性能问题.我基本上有以下布局……

描述
简而言之,有一个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 – onMeasure被称为1500次全部内容,希望文章能够帮你解决android – onMeasure被称为1500次所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1122268.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存