Bri*_*ian 3 android textview android-layout android-viewpager onmeasure
我最近发现我的应用程序出现了严重的性能问题.我基本上有以下布局......

描述
简而言之,有一个ViewPager持有3 RelativeLayout秒作为页面.每个页面里面都有一些TextViews.我最近注意到当我输入EditText有一个延迟TextWatcher来执行快速SQL查询以进行自动完成时会出现很多延迟.当我输入文本时,我的HTC One M8口吃和滞后,但我知道这不是查询速度慢,因为我测量的查询只花了大约7毫秒.
我使用了方法分析,Systrace和简单的旧Log调试,并得出结论,每次我在A,B和C 内的s 上进行EditText约1,700次调用时输入一个字符.累计,只有大约15个独立的s页面.我注意到每个都被调用了数百次而不是像往常一样被调用一次或两次.onMeasureTextViewRelativeLayoutTextViewonMeasure
问题
我不知道为什么EditText在页面B中键入会导致TextView页面A和C中的其他s也被"重新测量".更重要的是,是否有人对如何onMeasure经常被召唤的原因有所了解?并且,有没有人知道一个显着减少呼叫次数的解决方案onMeasure?
详情
这可能有所帮助:我实际上能够onMeasure通过删除RelativeLayout2 来减少大约900 的呼叫次数,这可能表明onMeasure呼叫的传播开始于ViewPager.
虽然我没有足够的信息来确定具体问题,但总的来说,我可以告诉你发生了什么:
对根视图的measure调用会导致measure对树中每个子视图的调用,依此类推.
假设名为"当前视图"的视图在询问每个子视图以自我测量之后,确定没有足够的空间供所有子项使用.它将要求他们每个人再次测量自己,建议最大尺寸.那么,假设名为"相对布局B"的视图根据指定的最大值从根本上改变其大小.因为变化太大,"当前观点"必须再次询问每个孩子.此循环可能很容易需要多次迭代才能解决.
当"当前视图"决定其大小时,它会向"查看寻呼机"报告.假设"View Pager"没有足够的空间用于其三个视图,并且必须要求他们重新测量,最大值.我们现在至少有20次调用TextView onMeasure.如果ViewPager上面的每个其他视图都会迭代几次,很快就会看到大数字.
正如您已经指出的,最好的解决方案是减少树的深度.或者,您可以使用具有更简单的测量算法的布局管理器(FrameLayout,LinearLayout)
1500虽然很多.其中一种观点是做一些奇怪的事情.您应该能够使用DDMS套件中的TreeView工具非常简单地识别它.在eclipse中,它被称为"TreeView".在Studio中,单击Android图标并切换到"层次结构视图"透视图.您也可以从SDK工具目录的命令行运行它.
补充: 如果您在应用程序运行时将Hierarchy Viewer连接到您的应用程序,您将在其中一个窗格中看到整个视图树.树中的每个节点都有三个朝向底部的彩色橡皮糖.第一个胶基糖代表测量阶段.如果胶基糖是绿色的,那么该视图的测量阶段很快.如果它是黄色,则该节点位于布局中节点的前50%.如果它是红色,则它是布局中最慢的.
你应该可以沿着黄色的痕迹跟踪违规视图.
| 归档时间: |
|
| 查看次数: |
4932 次 |
| 最近记录: |