StrictMode 是一个开发者工具,用于捕获在应用主线程中发生的磁盘I/O、网络访问违例等问题。
StrictMode 有两个策略,一个是线程策略,即 TreadPolicy,如下所示:
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectCustomSlowCalls() //配合StrictMode.noteSlowCall使用
.detectDiskReads()//是否在主线程中进行磁盘读取
.detectDiskWrites()//是否在主线程中进行磁盘写入
.detectNetwork() // 是否在主线程中进行网络请求
.penaltyDialog() //弹出违规提示对话框
.penaltyLog() //在Logcat 中打印违规异常信息
.penaltyFlashScreen() //会造成屏幕闪烁
.penaltyDropBox()//将违规信息记录到 dropbox 系统日志目录中
.build()
)
// noteSlowCall 用于触发耗时警告
@WorkerThread
public boolean compress(CompressFormat format, int quality, OutputStream stream) {
...
StrictMode.noteSlowCall("Compression of a bitmap is slow");
...
return result;
}
一个是VM策略,即 VmPolicy,如下所示:
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectActivityLeaks()//Activity是否内存泄漏
.detectLeakedSqlLiteObjects()//数据库是否未关闭
.detectLeakedClosableObjects()//文件是否未关闭
.setClassInstanceLimit(MainActivity.class, 1) //某个类在内存中实例上限
.detectLeakedRegistrationObjects()//对象是否被正确关闭
.penaltyLog()//打印日志,可以通过 StrictMode 来过滤
.penaltyDeath()//直接Crash掉当前应用程序
.build()
)
我们也可以在需要的时候扩充StrictMode,代码如下所示:
StrictMode.ThreadPolicy oldThreadPolicy = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(oldThreadPolicy)
.permitDiskWrites() // 在原有策略的规则基础上,不监测读写磁盘
.build());
StrictMode.VmPolicy oldVmPolicy = StrictMode.getVmPolicy();
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder(oldVmPolicy)
.setClassInstanceLimit(MainActivity.class, 1) // 可以在内存中,设置 MainActivity.class 的实例为1
.build());