如何在Android项目中优化卡顿

如何在Android项目中优化卡顿?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

创新互联主营古雷港网站建设的网络公司,主营网站建设方案,重庆App定制开发,古雷港h5重庆小程序开发公司搭建,古雷港网站营销推广欢迎古雷港等地区企业咨询

卡顿原因

过于复杂的布局

  • 界面性能取决于 UI 的渲染性能,UI 渲染的整个过程由 CPU 和 GPU 两个部分协同完成。CPU 负责 UI 布局元素的 Measure、Layout、Draw 等相关运算执行,GPU负责栅格化(rasterization),将 UI 元素绘制到屏幕上。

  • 如果 UI 布局层次太深,或是自定义控件的 onDraw 中有复杂运算,CPU 的相关运算就可能大于 16ms,导致卡顿。

过度绘制

UI 线程的复杂运算

  • UI 线程的复杂运算会造成 UI 无响应,导致 ANR,但更多的是造成 UI 响应停滞卡顿,ANR 是卡顿的极致。

频繁的 GC

优化方法

1、减少刷新次数

比如进度更新,要进度有变化再去刷新,且保证频率不得高于系统的刷新频率。

2、避免非必要的刷新

若控件不可见,则无需刷新。

3、避免后台线程影响

如列表控件,在滑动时不要去加载图片,可以在滑动监听里停止图片的加载。

4、局部刷新

如 RecyclerView 的 DiffUtil。自定义 View 可以使用下面两个方法:

invalidate(Rect dirty);
invalidate(int left, int top, int right, int bottom);

5、尽量使用属性动画,它减少了自身的重绘。最后要清除

StringBuilder,List 等在创建时传入一个合适的参数指定初始容量,以避免频繁扩容的开销。

6、开启硬件加速

7、原理可见 Android硬件加速原理与实现简介,理解Android硬件加速原理的小白文

Application 级别

Activity 级别

Window 级别

getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View 级别

// 如果是 software,会将 View 绘制到一个 Bitmap,
// 然后依然是通过硬件加速将 Bitmap 绘制到 Canvas
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
  • LAYER_TYPE_NONE:普通渲染方式,不会返回一个离屏的缓冲,默认值。

  • LAYER_TYPE_HARDWARE:如果这个应用使用了硬件加速,这个 View 将会在硬件中渲染为 硬件纹理,如果应用程序并没有被硬件加速,则其效果和 LAYER_TYPE_SOFTWARE 相同。

  • LAYER_TYPE_SOFTWARE:此 View 通过软件渲染为一个 Bitmap。

检查是否开启了硬件加速

view.isHardware-Accelerated();
Canvas.isHardwareAccelerated();

如果 View 中要处理中文长文本,需要关闭硬件加速。因为每个中文编码不一样,缓存效果不理想。

监控

  1. 《Android 应用性能优化最佳实践》2.8 章,主要利用 MainLooper 里的 Printer。

  2. BlockCanary 开源库

  3. StrctMode

ANR

Activity 的 View:5 秒无响应
BroadcastReceiver:10 秒无响应
Service:20 秒无响应

ANR 时,系统会生成一个 traces.txt 的文件放在 /data/anr/ 下。通过 adb 命令将其导出到本地

$adb pull data/anr/traces.txt ~/Desktop

关于如何在Android项目中优化卡顿问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


本文名称:如何在Android项目中优化卡顿
标题来源:http://pwwzsj.com/article/pesjos.html