StrictMode是一个开发工具,它可以检测出你可能正在做的事情,并引起你的注意,这样你就可以修复它们。
StrictMode最常用于捕获应用程序主线程上的意外磁盘或网络访问,在主线程是用来接收UI操作并执行动画。使磁盘和网络操作远离主线程有助于应用程序更平滑、更灵敏。通过保持应用程序的主线程响应,还可以防止向用户显示ANR对话框。
在Application和Activity的OnCreate()中添加下面的代码:
// DEVELOPER_MODE代表只在调试模式下启用StrictMode
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectCustomSlowCalls()
.detectNetwork()//用于检查UI线程中是否有网络请求
.detectDiskReads()
.detectDiskWrites()//是磁盘读写检查
.detectCustomSlowCalls()//主要用于帮助开发者发现UI线程中调用的哪些方法执行的比较慢,
// 要和StrictMode.noteSlowCall配合使用,
// 只有通过 StrictMode.noteSlowCall标记“可能会”执行比较慢的方法,
// 只有标记过的方法才能被检测到,日志中会记录方法的执行时间
// (注意:只有在主线程中执行的方法才会显示执行时间,在其他线程中执行的方法,
// 就算是使用StrictMode.noteSlowCall标记,在日志中也不会打印执行时间)
//.penaltyDeath() //当触发违规条件时,直接Crash掉当前应用程序
//.penaltyDeathOnNetwork() //当触发网络违规时,Crash掉当前应用程序
//.penaltyDialog() //触发违规时,显示对违规信息对话框
//.penaltyFlashScreen() //会造成屏幕闪烁,不过一般的设备可能没有这个功能
//.penaltyDropBox() //将违规信息记录到 dropbox 系统日志目录中(/data/system/dropbox),你可以通过如下命令进行插件
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectActivityLeaks() //用户检查 Activity 的内存泄露情况
.detectLeakedClosableObjects()
.detectLeakedSqlLiteObjects()//资源没有正确关闭时回触发,
// detectLeakedSqlLiteObjects() 和 detectLeakedClosableObjects()的用法类似,
// 只不过是用来检查 SQLiteCursor 或者 其他 SQLite 对象是否被正确关闭
.detectLeakedRegistrationObjects() //用来检查 BroadcastReceiver 或者
// ServiceConnection 注册类对象是否被正确释放
.setClassInstanceLimit(Thread.class, 10) //设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露
.penaltyLog()
//.penaltyDeath()
.build());
StrictMode不是一种安全机制,不能保证找到所有磁盘或网络访问。虽然在进行绑定器调用时它确实会跨进程边界传播其状态,但它最终仍然是一种尽力而为的机制。值得注意的是,来自JNI调用的磁盘或网络访问不一定会触发它。Android的未来版本可能会捕获更多(或更少)操作,因此您不应该在Google Play上发布的应用程序中启用StrictMode。
网友评论