如果UI线程被阻止5秒钟,则APP应用程序此时会弹出ANR对话框,ANR对APP应用程序来说是一个严重的问题。 如何防止在APP应用程序中出现ANR? 另外,如何分析确认ANR问题的原因? 介绍安卓的严格模型。
如何打开严格模式
有两种打开方法。
开发人员选项
进入开发者选项,在中找到并打开启用严格模式。 如果APP应用程序主线程执行长时间操作,屏幕将闪烁。
严格模式API (代码调用) ) ) ) ) ) )。
可以在Activity或自定义Application类的onCreate方法中打开严格模式。
//设置线程策略
严格模式. setthreadpolicy (newstrictmode.thread policy.builder ) )。
. detectDiskReads磁盘读取
. detectDiskWrites磁盘写入
.检测网络
. penaltyLog () )。
. build ();
设置//虚拟机策略
严格模式. setvmpolicy (newstrictmode.VM policy.builder ) )。
. detectActivityLeaks () )
. detectleakedsqlliteobjects (/SQLite对象
. detectLeakedClosableObjects (
. penaltyLog () )。
. penaltydeath(//触发违规操作,技能APP应用程序
. build ();
严格模式API的使用方法
严格模式可以视为策略设置、违规操作检测和处罚。
策略的设置有两种
设置setThreadPolicy //线程策略
设置setVmPolicy //策略
违规检测操作分为线程策略可以检测到的违规操作和虚拟机策略可以检测到的违规操作
线程策略中可检测到的违规操作
detectDiskReads (
detectDiskWrites (
检测网络(
detectCustomSlowCalls (
虚拟机策略可以检测到的违规操作
检测activityleaks (
detectLeakedSqlLiteObjects (
detectLeakedClosableObjects (
detectFileUriExposure (
detectleakedregistrationobjects ()
惩罚方式
penaltyLog ()//打印日志
杀死penaltyDeath ()//进程
penaltyDialog ()//弹出对话框
如何分析严格模式日志
可以在ADB shell中过滤严格模式日志。
ADB log cat-s严格模式
过滤严格模式日志时,为以下:
02-1221:4336041.580: e /严格模式(14269 ) : classcom.test.test activity; instances=2; limit=1
02-122133604336041.580: e/strict mode (14269 ) : Android.OS.strict mode $ instancecountviolation 3360 classcom instion limit=1
02-1221:4336041.580: e /严格模式(14269 ) : at Android.OS.strict mode.setclassinstancelimit )严格模式
如果instances=2 limit=1,则只有一个名称限制的TestActivity实例,但有两个实例表明TestActivity存在内存泄漏。
其他严格模式日志可以根据上下文描述分析是什么违规导致的。