当前位置:   article > 正文

Android性能优化之获取界面绘制时间_安卓计算view创建耗时

安卓计算view创建耗时

两个目标:

1、获取界面整体绘制时间。

2、获取界面中每个控件的绘制时间。

优化方向:选出界面绘制时间最长的,然后再根据控件绘制时间等进行优化。

界面绘制时间获取方式,方法很多种,我这里用的是AOP模式,仅做参考。

同时也可参照:https://blog.csdn.net/Hello___Sunshine/article/details/93629281

第一步引入插件:

  1. dependencies {
  2. .....
  3. classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0'//AOP模式监测
  4. }

创建监测类,并实现功能:

  1. **
  2. * Created by tanbo on 2019-07-04.
  3. * Hello World!
  4. */
  5. @Aspect
  6. public class ActivityCreateTimeAop {
  7. @Around("execution(* android.app.Activity.setContentView(..))")
  8. public void onCreateTime(ProceedingJoinPoint joinPoint){
  9. long start = System.currentTimeMillis();
  10. try {
  11. joinPoint.proceed();
  12. } catch (Throwable throwable) {
  13. throwable.printStackTrace();
  14. }
  15. TBTools.log().i(joinPoint.getSignature().toString() +" onCreate 执行时间>>>"+(System.currentTimeMillis()-start));
  16. }
  17. }

运行项目后,控制台会输出当前界面的绘制时间:

{Thread:main}[tag=>APPAplication$2.afterHookedMethod(line:68):] ==========> void android.support.v7.app.AppCompatActivity.setContentView(int) onCreate 执行时间>>>84

可以看出当前界面的setContentView方法绘制执行时间,跳转其他界面时,会输出当前界面的绘制时间。

获取界面绘制时间到此结束。

---------------------------------------------------------------------------------------------------------------------------------------------------------

获取界面中所有控件绘制时间:

我这里是通过LayoutInflaterCompat.setFactory方式进行获取,在界面onCreate方法中,super.Oncreate之前写入我们的代码,通过拦截获取到当前界面中控件的绘制消耗时间,直接上代码:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. LayoutInflaterCompat.setFactory(LayoutInflater.from(this), new LayoutInflaterFactory() {
  4. @Override
  5. public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
  6. //获取指定类型控件的方法
  7. // if(!TextUtils.isEmpty(name) && name.equals("Button")){
  8. // Button button = new Button(context, attrs);
  9. // return button;
  10. // }
  11. //替换成自己的控件方法
  12. // if(!TextUtils.isEmpty(name) && name.equals("TextView")){
  13. // Button button = new Button(context, attrs);
  14. // return button;
  15. // }
  16. long start = System.currentTimeMillis();
  17. AppCompatDelegate delegate = getDelegate();
  18. View view = delegate.createView(parent, name, context, attrs);
  19. TBTools.log().i("main activity"+name+" 绘制耗时>>>> "+(System.currentTimeMillis() - start));
  20. return view;
  21. }
  22. });
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main2);

运行以上代码,输出如下:

  1. {Thread:main}[tag=>APPAplication$2.afterHookedMethod(line:68):] ==========> main activityImageView 绘制耗时>>>> 1
  2. {Thread:main}[tag=>APPAplication$2.afterHookedMethod(line:68):] ==========> main activityButton 绘制耗时>>>> 6
  3. {Thread:main}[tag=>APPAplication$2.afterHookedMethod(line:68):] ==========> main activityTextView 绘制耗时>>>> 3
  4. {Thread:main}[tag=>APPAplication$2.afterHookedMethod(line:68):] ==========> main activityFrameLayout 绘制耗时>>>> 0
  5. {Thread:main}[tag=>APPAplication$2.afterHookedMethod(line:68):] ==========> main activityImageView 绘制耗时>>>> 2
  6. {Thread:main}[tag=>APPAplication$2.afterHookedMethod(line:68):] ==========> main activityRelativeLayout 绘制耗时>>>> 0
  7. {Thread:main}[tag=>APPAplication$2.afterHookedMethod(line:68):] ==========> main activityTextView 绘制耗时>>>> 3

这里会输出当前界面中所有控件的绘制时间,我们可以根据耗时长短进行针对性的优化操作。

同时LayoutInflaterCompat.setFactory也可用于其他很多操作,如替换view,夜间模式等操作,详情谷歌百度。

-----------------------------------------------------------------------------------------------------------------------------------------

总结:

以上两种方式进行布局选择优化,减少了代码侵入性,实现方式更美观,但优化的同时最好也结合其他工具进行操作,如sys等。

方式千千万,自己用着顺手就好。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/494813
推荐阅读
相关标签
  

闽ICP备14008679号