如何在Android项目中优化卡顿?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
卡顿原因
过于复杂的布局
过度绘制
UI 线程的复杂运算
频繁的 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项目中优化卡顿问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注天达云行业资讯频道了解更多相关知识。