StrictMode简介

  • Android开发者官网对StrictMode的介绍
  • StrictMode类是Android 2.3(API 9)引入的一个工具类
  • 用来帮助开发者发现代码中一些不规范的问题,比如:
    • 在UI线程中进行了网络或磁盘操作,StrictMode就会通过LogCat或者对话框的方式把信息提示给开发者,因为UI线程处理这些操作会认为是不规范的做法,可能会让你的应用变得比较卡顿

如何启用StrictMode

  • 通常在Activity或者自定义的Application类的onCreate方法中启动StrictMode
// DEVELOPER_MODE代表只在调试模式下启用StrictMode
if (DEVELOPER_MODE) {StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork()   // or .detectAll() for all detectable problems.penaltyLog().build());StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
}

StrictMode详解

  • StrictMode通过策略方式来让你自定义需要检查哪些方面的问题,主要有两种策略:

    • ThreadPolicy:线程方面的策略
    • VmPolicy:VM方面的策略

ThreadPolicy详解

  • StrictMode.ThreadPolicy.Builder主要方法如下:

    • detectNetwork():用于检查UI线程中是否有网络请求

    • detectDiskReads()和detectDiskWrites():是磁盘读写检查

    • detectCustomSlowCalls():主要用于帮助开发者发现UI线程中调用的哪些方法执行的比较慢,要和StrictMode.noteSlowCall配合使用,只有通过StrictMode.noteSlowCall标记“可能会”执行比较慢的方法,只有标记过的方法才能被检测到,日志中会记录方法的执行时间(注意:只有在主线程中执行的方法才会显示执行时间,在其他线程中执行的方法,就算是使用StrictMode.noteSlowCall标记,在日志中也不会打印执行时间)

    • penaltyDeath():当触发违规条件时,直接Crash掉当前应用程序

    • penaltyDeathOnNetwork():当触发网络违规时,Crash掉当前应用程序

    • penaltyDialog():触发违规时,显示对违规信息对话框

    • penaltyFlashScreen():会造成屏幕闪烁,不过一般的设备可能没有这个功能

    • penaltyDropBox():将违规信息记录到 dropbox 系统日志目录中(/data/system/dropbox),你可以通过如下命令进行插件

      adb shell dumpsys dropbox dataappstrictmode  --print
    • permitCustomSlowCalls()、permitDiskReads ()、permitDiskWrites()、permitNetwork: 如果你想关闭某一项检测,可以使用对应的permit*方法

    VMPloicy详解

    • detectActivityLeaks() 用户检查 Activity 的内存泄露情况
    • detectLeakedClosableObjects() 和 detectLeakedSqlLiteObjects(),资源没有正确关闭时回触发,detectLeakedSqlLiteObjects() 和 detectLeakedClosableObjects()的用法类似,只不过是用来检查 SQLiteCursor 或者 其他 SQLite 对象是否被正确关闭
    • detectLeakedRegistrationObjects() 用来检查 BroadcastReceiver 或者 ServiceConnection 注册类对象是否被正确释放
    • setClassInstanceLimit(),设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露

利用调试模式的特点,在debug模式下设置StrictMode

ApplicationInfo appInfo = context.getApplicationInfo();
int appFlags = appInfo.flags;
if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {  // Do StrictMode setup here  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  .detectLeakedSqlLiteObjects()  .penaltyLog()  .penaltyDeath()  .build());
} 

利用反射技术调用StrictMode,避免在2.3以下版本出现问题

try {  Class sMode = Class.forName("android.os.StrictMode");  Method enableDefaults = sMode.getMethod("enableDefaults"); // enableDefault()是严苛模式(StrictMode)类的另一个函数,它检测所有违例并写入LogCat。因为这里调用的是静态形式的enableDefault(),所以用null作为参数传入。enableDefaults.invoke(null);
}
catch(Exception e) {  // StrictMode not supported on this device, punt  // 当严苛模式(StrictMode)不存在,将捕捉到ClassNotFoundException异常。Log.v("StrictMode", "... not supported. Skipping...");
}  

转载于:https://www.cnblogs.com/coderwjq/p/7079158.html

Android开发之StrictMode相关推荐

  1. android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

    android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序   在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...

  2. Android开发之TextView高级应用

    Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...

  3. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  4. android注册弹窗,Android开发之PopupWindow创建弹窗、对话框的方法详解

    本文实例讲述了Android开发之PopupWindow创建弹窗.对话框的方法.分享给大家供大家参考,具体如下: 简介: PopupWindow 可创建类似对话框风格的窗口 效果: 使用方法: 使用P ...

  5. Android开发之旅:组件生命周期(二)

    引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  6. Android开发之SpannableString具体解释

    在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...

  7. Android开发之2048安卓版

    之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...

  8. android语音播放工具类,Android开发之MediaPlayer多媒体(音频,视频)播放工具类

    本文实例讲述了Android开发之MediaPlayer多媒体(音频,视频)播放工具类.分享给大家供大家参考,具体如下: package com.android.imooc.chat; import ...

  9. Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)

    鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio  Android Studio 是一个Android开发环境,基于Intel ...

最新文章

  1. php正则表达式实例详解,正则表达式实例解析
  2. 张永伟 大数据会成为互联时代重要变革
  3. java final修饰属性_Java final关键字用来修饰类、方法、属性
  4. 计算机适配器有什么作用,例举适配器是什么
  5. [蓝桥杯]2019年第十届省赛真题C/C++ B组 填空+大题
  6. matlab计算macd_matlab计算MACD指标
  7. python获取参数
  8. 一名靠谱的JavaScript程序员应备的素质
  9. linux mount nfs 超时,I / O无法(偶尔)挂载NFS-服务器超时
  10. cisco ios cookbook
  11. 拓端tecdat|R语言使用随机技术差分进化算法优化的Nelson-Siegel-Svensson模型
  12. 【2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) F】Rectangles【扫描线】
  13. java 操作日志记录_高效日志系统搭建秘技!架构师必读
  14. 最新仿技术导航网源码 全开源自助友链系统
  15. 人教版四年级上次计算机教案,人教版四年级上册数学教案
  16. table 去掉td重复的边框_css怎么解决表格边框线重复问题
  17. 计算机与网络如何连接网络设置,电脑网络连接网络配置方法
  18. 一款精简的webshell管理工具 -- Assassin
  19. 三角函数公式合集——从诱导公式到求导公式
  20. 刘新华老师-沪师经纪

热门文章

  1. 【自我感悟致学弟学妹】大三上的感悟,何为真正优秀的人
  2. 【恋上数据结构】快速排序
  3. j2ee与mysql乱码过滤_J2EE中文乱码处理
  4. 深度剖析 | 基于大数据架构的BI应用
  5. 比_thread高级的threading模块,对比释放锁例子
  6. vue里面v-cloak/v-text/v-html/v-pre的应用
  7. dnf搬砖代码Python_DNF:95版本搬砖角色怎么提高移速,不花钱就花时间吧
  8. python如何打开npy文件_操作python实现npy格式文件转换为txt文件
  9. 洛谷 P1918保龄球
  10. 计算机网络 第六章 应用层