Android出现使用不流畅,卡顿及ANR,主要原因有三个
1、CPU使用过高:
这个要排除是我们自己的APP还是有别的优先级更高的进程在占用APP,如果是我们自己的app占用CPU过高,那就需要对代码进行研究定位,比如定位操作,长时间的进行位置搜索会持续占占有CPU, 还有我们的常驻广播也是会占有CPU
2、系统内存使用过高:
一个是系统本身内存就小,还有同时打开的应用过多,这些都会占用内存,但是最主要的可能还是我们的代码不够规范从而造成的内存浪费,内存泄漏引起的内存使用过高。比如我们的死循环,递归,对象和变量等没有及时的回收,非常驻广播没有解除注册,长生命周期的持有短生命周期的引用,比如activity中的内部类会持有一个activity的引用,等等这些都有可能造成内存泄漏,内存泄漏过多最终就会导致OOM.所以我们一般会对app的性能进行检测,系统自带的StrictMode,studio的profiler 还有三方LeakCanary都是可以来帮助我们进行性能优化的工具。
StrictMode有两个检测策略:线程检测策略(ThreadPolicy)和虚拟机策略(VMPolicy)
ThreadPolicy检测:自定义的耗时操作,磁盘读写,网络请求
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()//线程策略(ThreadPolicy)
.detectDiskReads()//检测在UI线程读磁盘操作
.detectDiskWrites()//检测UI线程写磁盘操作
.detectCustomSlowCalls()//发现UI线程调用的哪些方法执行得比较慢
.detectResourceMismatches()//最低版本为API23 发现资源不匹配
.detectNetwork() //检测在UI线程执行网络操作
.detectUnbufferedIo()
VMPolicy检测:activity泄漏,closeable对象未关闭,sqlite使用完了未释放,对象实例的个数
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()//虚拟机策略(VmPolicy)
.detectActivityLeaks()//最低版本API11 用户检查 Activity 的内存泄露情况
.detectCleartextNetwork()//最低版本为API23 检测明文的网络
.detectFileUriExposure()//最低版本为API18 检测file://或者是content://
.detectLeakedClosableObjects()//最低版本API11 资源没有正确关闭时触发
.detectLeakedRegistrationObjects()//最低版本API16 BroadcastReceiver、ServiceConnection是否被释放
.detectLeakedSqlLiteObjects()//最低版本API9 资源没有正确关闭时回触发
.setClassInstanceLimit(HXHelper.class, 1)//设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露
3、UI阻塞:
UI阻塞呢主要也是两个方面:一是主线程的消息队列中的消息过多,造成我们的UI界面的一些交互事件来不及处理,被阻塞
二是代码执行耗时,代码执行耗时呢,可能是因为代码本身执行起来就很耗时,比如IO操作,网络请求,还有一个原因就是等锁,可能执行到这里,锁被其他线程给占用了,需要等待。还有一个可能是UI界面布局太过复杂