StrictMode
(严格模式)是一个在多种编程环境中都存在的概念,用于帮助开发者检测和改进代码的质量和性能。在Android开发中,StrictMode
可以识别并报告应用程序中的线程和虚拟机(VM)策略违规。
线程策略(Thread Policy)
线程策略主要关注应用程序的主线程(UI线程)的行为。任何阻塞主线程的操作都可能导致应用程序变得无响应(ANR)。线程策略可以检测以下类型的违规:
-
「磁盘读写」:在主线程上执行磁盘读写操作可能会导致应用程序变得缓慢或无响应。 -
「网络访问」:在主线程上执行网络操作也可能导致性能问题。 -
「自定义检测」:开发者还可以定义自己的检测逻辑来识别其他类型的线程违规。
虚拟机策略(VM Policy)
虚拟机策略关注虚拟机级别的违规,如内存泄漏和不必要的对象创建。虚拟机策略可以检测以下问题:
-
「内存泄漏」:当对象不再需要时仍然被引用,则会导致内存泄漏。虚拟机策略可以报告这些潜在的泄漏。 -
「不必要的对象创建」:在频繁调用的方法或循环中创建不必要的对象可能导致性能下降和额外的垃圾收集开销。虚拟机策略可以检测这种情况。
启用StrictMode
在Android应用程序中启用StrictMode
通常在应用程序的入口点(Application
类或主Activity
的onCreate
方法)中调用StrictMode
的静态方法。
if (BuildConfig.DEBUG) {
//开启Thread策略模式
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectNetwork()//监测主线程使用网络io
.detectCustomSlowCalls()//监测自定义运行缓慢函数
.detectDiskReads() // 检测在UI线程读磁盘操作
.detectDiskWrites() // 检测在UI线程写磁盘操作
.penaltyLog() //写入日志
.penaltyDialog()//监测到上述状况时弹出对话框
.build());
//开启VM策略模式
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()//监测sqlite泄露
.detectLeakedClosableObjects()//监测没有关闭IO对象
.setClassInstanceLimit(MainActivity.class, 1) // 设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露
.detectActivityLeaks()
.penaltyLog()//写入日志
.penaltyDeath()//出现上述情况异常终止
.build());
}
注意事项
-
启用 StrictMode
可能会增加应用程序的CPU和内存使用,在生产环境中应该禁用。 -
StrictMode
只是一个工具,用于帮助开发者识别潜在问题。不应该用来替代良好的编程实践和性能测试。 -
某些违规(如磁盘读写和网络访问)在特定情况下可能是必要的,在使用 StrictMode
时应该仔细考虑其配置和处罚措施。
原文始发于微信公众号(沐雨花飞蝶):Android开发中StrictMode的妙用,帮助开发者检测并改进代码的质量和性能
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/290479.html