android UI卡顿问题学习
转自https://blog.csdn.net/joye123/article/details/79425398
https://blog.csdn.net/zhenjie_chang/article/details/52584967
卡顿优化
卡顿:从用户角度说,App操作起来缓慢,响应不及时,列表滑动一顿一顿的,动画刷新不流畅等等一些直观感受。从系统角度来说,屏幕刷新的帧率不稳定,无法保证每秒绘制60帧,也就是说有掉帧的情况发生。
对于开发过程,出现卡顿的主要原因是主线程做了一些不该做的事,或者主线程做不了事情了。
- 布局渲染(解析、测量、布局、渲染)
- 动画执行
- Binder通信
- 界面响应
主线程主要是做以上四个方面的工作,如果在主线程做一些耗时操作(网络请求、IO读写等),或者被其他线程挂起(GC),那么页面刷新无法在16ms内完成,就会出现掉帧的情况。

- 原色:没有过度绘制
- 蓝色:过度绘制1次
- 绿色:过度绘制2次
- 粉色:过度绘制3次
- 红色:过度绘制4次或更多
请注意,这些颜色是半透明的,因此,您在屏幕上看到的确切颜色取决于您的界面内容。可以通过此功能查看哪些页面的布局层级过深。
常见卡顿原因及解决方案
过度绘制
去除不必要的背景色
- 设置窗口背景色为通用背景色,去除根布局背景色。
- 若页面背景色与通用背景色不一致,在页面渲染完成后移除窗口背景色
- 去除和列表背景色相同的Item背景色
布局视图树扁平化
- 移除嵌套布局
- 使用merge、include标签
- 使用性能消耗更小布局(TableLayout、ConstraintLayout)
减少透明色,即alpha属性的使用
- 通过使用半透明颜色值(#77000000)代替
其他
- 使用ViewStub标签,延迟加载不必要的视图
- 使用AsyncLayoutInflater异步解析视图
主线程耗时操作
- Json数据解析耗时(Cache类)
- 文件操作(获取所属渠道名称)
- Binder通信(获取系统属性(mac地址))
- 正则匹配(Hybird 通信)
- 相机操作:初始化、预览、停止预览、释放(反扫)
- 组件初始化(推送)
- 循环删除、创建View(更多页面)
- WebView首次初始化
布局优化的一些策略
1. <include>标签
2. <viewstub>标签
3.<merge>标签
4.去除不必要的嵌套和View节点
5.减少不必要的infalte
6.View局部更新
android UI卡顿问题学习的更多相关文章
- Android异常与性能优化相关面试问题-ui卡顿面试问题详解
UI卡顿原理: “60fps(Frames Per Second每秒传输帧数) ----> 16ms” 针对上面标红的数字,下面具体说明一下:最主要的根源在于渲染性,Android会每隔16ms ...
- 性能优化九之UI卡顿分析
在前一篇博客中提到内存抖动和耗时复杂的计算会导致UI卡顿. 那为什么内存抖动会导致UI卡顿呢? 其实在 性能优化一之内存与垃圾回收器 这篇文章中已经有所提及. 这里来详细说明一下: 渲染功能是应用程序 ...
- ART:Android 摆脱卡顿的希望?
与 iOS 相比,Android 的用户体验有个相对糟糕的开始.在很长的时间里,界面一直丑小鸭,卡顿也是挥不去的痛.不过,在 Google 的全力推动,以及硬件厂商的响应下,Android 还是跨越各 ...
- Winform 界面执行耗时操作--UI卡顿假死问题
UI卡顿假死问题 误区1:使用不同的线程操作UI控件和耗时操作(即,跨线程操作UI控件CheckForIllegalCrossThreadCalls = false;), 注意:此处只是为了记录... ...
- android切换卡顿解决方法
如果想要让应用用户流畅的滑动体验的话,那么就必须对activity和fragment的生命周期有一个完整的概念以及在何种情况下会触发哪些事件. 在自己目前做的项目中,就遇到了这样的问题,那么就把自己的 ...
- Android 最简单的测试UI卡顿
就两个类: public class BlockDetectByPrinter { private static final String START = ">>>> ...
- Android Studio 卡顿解决
每次升级/安装 Android Studio 之后最好都修改一下这个参数:到 Android Studio 安装目录,找到 bin/studio(64?).vmoptions(文件名可能因操作系统而不 ...
- Android App卡顿慢优化之解决内存抖动及内存泄漏
前面一篇博客说到了,内存抖动的第二种情况,就是必须在短时间内创建对象,但是要控制数量:这个问题目前可以使用对象池的方法解决. 3)Object Pools 在程序里面经常会遇到的一个问题是短时间内创建 ...
- Android 布局渲染流程与卡顿优化
文章内容概要 一.手机界面UI渲染显示流程 二.16ms原则 三.造成卡顿的原因 四.过度绘制介绍.检测工具.如何避免造成过度绘制造成的卡顿 一.手机界面UI渲染显示流程 大家都知道CPU(中央处理器 ...
随机推荐
- POI操作Excel的三种Workbook的发展和区别
POI的一些使用方法: 创建流程:(上级为下级的载体) 1.创建Workbook(工作薄): 2.创建Sheet(表单,可以创建多个): 3.创建Row(行): 4.创建Cell(单元格) 接下来分别 ...
- css+div 绘制多边形
/*1.正方形*/ <div id="square"></div> #square { width: 100px; height: 100px; backg ...
- Project Euler 29 Distinct powers( 大整数质因数分解做法 + 普通做法 )
题意: 考虑所有满足2 ≤ a ≤ 5和2 ≤ b ≤ 5的整数组合生成的幂ab: 22=4, 23=8, 24=16, 25=3232=9, 33=27, 34=81, 35=24342=16, 4 ...
- locate-updatedb命令检索不全
locate-updatedb命令检索不全 执行updatedb命令,用于立刻更新locate命令所必需的数据库文件,但有些文件可能会在检索过程中被过滤掉. 有时候明明存在的文件,用find命令都能搜 ...
- Linux系统下python代码运行shell命令的方法
方法一:os.popen #!/usr/bin/python # -*- coding: UTF-8 -*- import os, sys # 使用 mkdir 命令 a = 'ls' b = os. ...
- PHP 中 call_user_func 的使用
call_user_func函数类似于一种特别的调用函数的方法,使用方法如下 第一种情况: function set_max($a,$b) { if($a>$b) echo $a; else e ...
- 作为深度学习最强框架的TensorFlow如何进行时序预测!(转)
作为深度学习最强框架的TensorFlow如何进行时序预测! BigQuant 2 个月前 摘要: 2017年深度学习框架关注度排名tensorflow以绝对的优势占领榜首,本文通过一个小例子介绍了T ...
- [MongoDB实战]Part1 起步
本书的这部分对MongoDB进行了一个大致的简介.包括了Javascript Shell和Ruby驱动,这俩都有例子 在第一章,我们将了解到MongoDB的历史,设计目的和实际使用的场景.我们还将了解 ...
- Qunie——自我生成程序
Qunie是一段没有输入.但输出和它本身源代码同样的程序.本文无不论什么高深技术,纯属娱乐! 近期看到wikipedia的一个词条--Quine,简单介绍部分摘录于此,并简要翻译: A quine i ...
- Zookeeper源代码编译为Eclipseproject(win7下Ant编译)
为了深入学习ZooKeeper源代码,首先就想到将其导入到Eclispe中,所以要先将其编译为Eclispeproject. 1.什么是Ant??? Apache Ant™ Apache Ant is ...