Android LayoutInflater 监听单个控件渲染时长

在做布局优化的时候,需要在布局中定位到渲染时长比较长的控件去进行针对性的优化。那要怎么做呢?可以借助 LayoutInflater 的 Factory2 来实现

LayoutInflater.setFactory2() 方法用于设置 LayoutInflater.Factory2,它可以拦截修改 LayoutInflater 在解析布局文件时创建视图的过程。通过设置 Factory2,可以对创建的视图进行自定义处理,例如修改视图属性、替换视图类型等。

package android.view;

public abstract class LayoutInflater {
    // ...

    public final View tryCreateView(View parent, String name, Context context, AttributeSet attrs) {
        View view;
        if (mFactory2 != null) { // 若 mFactory2 不为空,则回调
            view = mFactory2.onCreateView(parent, name, context, attrs);
        } else {
            view = null;
        }

        // ...
        return view;
    }

    // ...
}

 每一个控件在创建时,若 Factory2 不为空时,都会执行回调


 使用:

public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        getLayoutInflater().setFactory2(new LayoutInflater.Factory2() {
            @Override
            public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
                long time = System.currentTimeMillis();
                View view = getDelegate().createView(parent, name, context, attrs);
                Log.i("kang", name + " 耗时:" + (System.currentTimeMillis() - time));
                return view;
            }

            @Override
            public View onCreateView(String name, Context context, AttributeSet attrs) {
                return null;
            }
        });

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

通过调用 setFactory2() 方法并传递自定义的 Factory2 实例,可以拦截和修改 LayoutInflater 创建视图对象的过程。拦截后可以做任何想做的事,例如动态地改变视图的外观、行为或属性。


核心思想就是计算单个 View 渲染前后的时间差,这样就知道单个控件渲染时长了,知道了单个渲染时长就能对单个耗时长的控件做针对性优化

需要注意的是,设置这个监听需要在 setContentView() 之前调用(因为如果都渲染完了,再设置监听那肯定就无效了)

猜你喜欢

转载自blog.csdn.net/weixin_47592544/article/details/131204216
今日推荐