如何在Android项目中优化卡顿?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
卡顿原因
过于复杂的布局
界面性能取决于 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 级别
<application android:hardwareAccelerated="true" />
Activity 级别
<activity android:hardwareAccelerated="true" />
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 中要处理中文长文本,需要关闭硬件加速。因为每个中文编码不一样,缓存效果不理想。
监控
《Android 应用性能优化最佳实践》2.8 章,主要利用 MainLooper 里的 Printer。
BlockCanary 开源库
StrctMode
ANR
Activity 的 View:5 秒无响应
BroadcastReceiver:10 秒无响应
Service:20 秒无响应
ANR 时,系统会生成一个 traces.txt 的文件放在 /data/anr/ 下。通过 adb 命令将其导出到本地
$adb pull data/anr/traces.txt ~/Desktop
关于如何在Android项目中优化卡顿问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。