美文网首页
StrictMode

StrictMode

作者: ArcherZang | 来源:发表于2019-11-26 16:49 被阅读0次

    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。

    相关文章

      网友评论

          本文标题:StrictMode

          本文链接:https://www.haomeiwen.com/subject/wvhywctx.html