摘要
StrictMode是一款开发工具,自Android2.3引入。StrctMode通过设置线程或者虚拟机的违规规则,检测当前运行代码是否有违反规则的行为,如果存在将以设置的违规方式通知用户。
我们接下来通过一个简单的例子来理解StrictMode。
1.简单例子
public void onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads() // 检测读磁盘
.detectDiskWrites() // 检测写磁盘
.detectNetwork() // 检测网络范文
.penaltyLog() // 如果有违规,通过日志打印
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() // 检测内存泄漏
.detectLeakedClosableObjects() // 检测内存泄漏
.penaltyLog() // 如果违规,打印违规日志
.penaltyDeath() // 如果违规,程序将崩溃
.build());
}
super.onCreate();
}
通过以上代码,在Activity的onCreate方法中设置的严苛模式。该模式仅在当前线程(主线程有效)。
在当前线程,如果有读写磁盘操作,将被视为违规,并通过日志打印违规信息。如果存在上述两种泄漏,将打印违规日志,同时应用程序崩溃。
2. StrictMode详细说明
2.1、策略
- StrictMode.ThreadPolicy
应用于某个线程的StrictMode策略
- StrictMode.VmPolicy
应用于虚拟机进程中的所有线程的StrictMode策略
2.2、方法
- ThreadPolicy.Builder中的一些方法:
- detectAll() : 侦测一切潜在违规
- detectCustomSlowCalls() : 侦测自定义的耗时操作
- detectDiskReads() : 侦测磁盘读
- detectDiskWrites() : 侦测磁盘写
- detectNetwork() : 侦测网络操作
- permitAll() : 禁用所有侦测
- permitDiskReads() : 允许磁盘读
- VmPolicy.Builder中的一些方法 :
- detectAll() : 侦测一切潜在违规
- detectActivityLeaks() : 侦测Activity(活动)泄露
- detectLeakedClosableObjects() : 当显式中止方法调用之后,假如可被Closeable类或其他的对象没有被关闭。
2.3、处罚
对于每个策略,我们可以指定多个处罚形式,而处罚也是从最不严重的到最严重(从打印日志到直接crash(崩溃))依次执行。
- penaltyDeath() : 违规时,直接使应用崩溃。
- penaltyDialog() : 违规时,向开发者显示一个恼人的Dialog对话框。
- penaltyLog() : 违规时,将违规信息写入系统日志。