Android性能优化
内存优化
ANR(应用程序无响应)
原因:一般是主线程未及时响应用户的输入事件(如触摸、按键);或者当前事件正在被处理,但是由于耗时太长没有能及时完成。常见的原因是主线程频繁进行耗时操作
解决:使用多线程,将耗时操作交给工作线程执行
CRASH(应用程序崩溃)
原因:一般是内存溢出
解决:内存优化,如:避免内存泄漏、避免内存抖动、图片Bitmap优化、优化代码
内存溢出
应用程序所需内存超出系统分配的内存限额,从而导致内存溢出
原因:内存中加载的数据量过于庞大,如一次性从数据库取出过多数据、内存泄漏、内存抖动、启动参数内存值设定的过小
内存泄漏
当一个对象已经不需要,本该被回收时,另外一个正在使用的对象持有它的引用导致它不能被回收而停留在堆内存中,就产生了内存泄漏。
原因:持有引用者的生命周期大于被引用者的生命周期、资源对象使用后未关闭
解决:集合类:回收集合元素;Static关键字修饰的成员变量:避免引用过多实例;资源使用后关闭资源对象
内存抖动
内存大小不断浮动的现象
原因:由于大量、临时的小对象频繁创建,导致程序频繁的分配内存,GC频繁回收内存。
Bitmap
原因:图片资源非常消耗内存,占用App内存的大部分,Android系统分配给每个应用程序的内存有限,因此可能引发内存溢出,导致应用崩溃
解决方案:
1.使用完毕后释放图片资源
2.根据分辨率适配图片
3.按需选择合适的解码方式
4.设置图片缓存(三级缓存机制)
启动优化
冷启动
启动应用时,后台没有该应用的进程,系统会重新创建一个新的进程分配给该应用(如第一次打开应用或者上一次彻底退出应用)
特点:系统会重新创建一个新的进程分配给它,会先创建和初始化Application类,再创建和初始化MainActivity类,包括一系列测量布局绘制,最后显示在界面上
流程:Zygote进程创建出一个新进程–>Application构造器–>attachBaseContext()–>onCreate()–>Activity构造器–>onCreate()–>配置主题背景等属性–>onStart()–>onResume()–>测量布局绘制显示在界面上
热启动
启动应用时,后台已有该应用的进程(如:按back,home键,应用退出,但仍保留在后台,可进入任务列表查看)
特点:系统直接从已有的进程中启动应用,不必创建和初始化Application,直接创建和初始化MainActivity,包括一系列测量布局绘制,显示在界面上
流程:Activity构造器–>onCreate()–>配置主题背景等属性–>onStart()–>onResume()–>测量布局绘制显示在界面上
优化启动方案
黑/白屏优化
系统在启动Activity的setConcentView之前绘制窗体,此时布局资源还没加载,于是使用了默认的背景色
解决:把启动图bg_splash设置为窗体背景,避免刚刚启动App的时候出现黑/白屏
<style name="Theme.AppLauncher" parent="@android:style/Theme.NoTitleBar.Fullscreen">
<item name="android:windowBackground">@drawable/bg_splash</item>
</style>
onCreate()优化
onCreate()耗时长会影响应用程序布局绘制的时间,因此应该减少onCreate()的工作量。
一般重写Application,在OnCreate()方法中做一些初始化操作(如第三方SDK配置),可以将这些较大的第三方库通过开启一个异步线程中进行初始化。
布局优化
思想:减少过度绘制(一般通过减少UI层级,简化布局实现)
方法:
1.善用相对布局RelativeLayout
可以通过扁平的RelativeLayout降低LinearLayout嵌套所产生布局树的层级
使用抽象布局标签include、merge、ViewStub
2.include、merge、ViewStub标签
< include />
include标签常用于将布局中的公共部分提取出来
< merge />
merge标签是作为include标签的一种辅助扩展来使用,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套(merge能够减少include可能产生的层级)
直接使用include标签引入了之前的LinearLayout之后导致了界面多了一个层级,若引入merge标签则可以减少一个层级
< ViewStub />
ViewStub是View的子类。他是一个轻量级View, 隐藏的,没有尺寸的View。他可以用来在程序运行时简单的填充布局文件
3.使用Android最新的布局方式ConstaintLayout
ConstraintLayout允许你在不适用任何嵌套的情况下创建大型而又复杂的布局。它与RelativeLayout非常相似,所有的view都依赖于兄弟控件和父控件的相对关系。但是,ConstraintLayout比RelativeLayout更加灵活
原文链接:https://blog.csdn.net/qq_29966203/article/details/101452875