最近在android 4.2上发现APP特别卡顿的问题,通过抓trace发现很多耗时在ViewGroup.resolveRtlPropertiesIfNeeded, View.resolveRtlPropertiesIfNeeded方法

查看相关代码,google4.2开始支持rtl,也就是右向坐right to left布局(一些很稀有的小语种国家)

发现每次重新mearsure都要对布局进行resolveRtlPropertiesIfNeeded

通过查看代码,发现4.2上这个功能做得不完善,4.2的代码:

    /**
     * @hide
     */
    @Override
    public void resolveRtlPropertiesIfNeeded() {
        super.resolveRtlPropertiesIfNeeded();
        int count = getChildCount();
        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.isLayoutDirectionInherited()) {
                child.resolveRtlPropertiesIfNeeded();
            }
        }
    }

递归调用时并没有判断是否需要对子view进行递归resolveRtlPropertiesIfNeeded。 并且View的默认rtlSupport是inherit,导致每次measure导游重新递归resolveRtlPropertiesIfNeeded

再看看4.3的代码:

    /**
     * @hide
     */
    @Override
    public boolean resolveRtlPropertiesIfNeeded() {
        final boolean result = super.resolveRtlPropertiesIfNeeded();
        // We dont need to resolve the children RTL properties if nothing has changed for the parent
        if (result) {
            int count = getChildCount();
            for (int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                if (child.isLayoutDirectionInherited()) {
                    child.resolveRtlPropertiesIfNeeded();
                }
            }
        }
        return result;
    }

由于没找到4,3的手机实际测试,没法确定4.3上android是否彻底解决这个问题,但是在5.0以上手机确实没发现一次measure过程resolveRtlPropertiesIfNeeded递归次数特别多。

针对这种情况,如果APP不需要支持右向左的小语种,可以在AndroidMenifest.xml声明关闭rtlSupport,并在style中声明layoutDirection为ltr

<application  android:supportsRtl="false"
 
<style name="xxxx" parent="@android:style/Theme.Light.NoTitleBar">    <item name="android:layoutDirection" tools:targetApi="jelly_bean_mr1">ltritem>


更多相关文章

  1. Ionic2实现自定义Cordova插件-Android屏幕录制
  2. android git gerrit 一些基本概念和问题
  3. Android(安卓)翻书效果
  4. Android(安卓)判断网络连接
  5. Android(安卓)studio 快捷键大全
  6. 使用Jenkins进行Android自动打包及SonarQube代码自动检测
  7. 【Android基础入门No.3】AndroidのListFragment
  8. "Kernel version" 中编译时间的前世今生
  9. 最简便实现Android(安卓)ListView选中item高亮显示

随机推荐

  1. TextView文字横向滚动(跑马灯效果)
  2. 『转』Android在TQ2440开发板上的移植
  3. Android(安卓)应用开发特色
  4. Android(安卓)Framework面试题
  5. Android(安卓)Design Support Library(一)
  6. Android命令行启动程序的方法
  7. Android(安卓)D8 编译器 和 R8 工具
  8. 【Android(安卓)Training UI】创建自定义
  9. Android静态安全检测 -> Activity组件暴
  10. android google map v1 v2 v3 参考