StrictMode类是Android 2.3 (API 9)增加的一个工具类;可以用来帮助开发者改进所编写的应用代码.并且提供各种策略随时检查和报告开发者所存在的问题
使用StrictMode
在应用程序入口Application,Activity或者其他Application组件的onCreate()方法中调用以下代码开启StrictMode:
public void onCreate() {
if (DEVELOPER_MODE) { //用于开发模式
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
super.onCreate();
}
StrictMode的两个策略
- ThreadPolicy 检测主线程中磁盘读写操作,网络操作,及调用的自定义代码是否执行得比较慢
以下主要方法:
detectNetwork(): 检查UI线程中是否有网络请求操作
detectDiskReads()和detectDiskReads(): 磁盘读写检查
detectCustomSlowCalls(): 发现UI线程调用执行较慢的方法;和 StrictMode.noteSlowCall 配合使用
penaltyDeath(): 当触发违规条件时,Crash当前应用程序
penaltyDeathOnNetwork(): 当触发网络违规时,Crash当前应用程序
penaltyDialog(): 触发违规时,显示对违规信息对话框
penaltyFlashScreen(): 会造成屏幕闪烁,不过一般的设备可能没有这个功能
penaltyDropBox(): 将违规信息记录到 dropbox(/data/system/dropbox)
permitCustomSlowCalls()、permitDiskReads ()、permitDiskWrites()、permitNetwork: 如果你想关闭某一项检测,可以使用对应的permit*方法
- VmPolicy 用于虚拟机方面的策略.如Activity内存泄露,SQLite内存泄露,资源未释放等
以下主要方法:
detectLeakedClosableObjects() 和 detectLeakedSqlLiteObjects(): 资源没有正确关闭时回触发
detectLeakedRegistrationObjects(): BroadcastReceiver 或者 ServiceConnection 注册类对象是否被正确释放
Tips:
下班后,我会打开StricMode然后跑一个正常人操作的Monkey脚本,第二天查看log改善程序