Android开发之StrictMode
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相关推荐
- android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序
android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序 在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...
- Android开发之TextView高级应用
Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大家分享一下TextView的一些使用技巧. A ...
- android之json解析优化,Android开发之json解析
目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...
- android注册弹窗,Android开发之PopupWindow创建弹窗、对话框的方法详解
本文实例讲述了Android开发之PopupWindow创建弹窗.对话框的方法.分享给大家供大家参考,具体如下: 简介: PopupWindow 可创建类似对话框风格的窗口 效果: 使用方法: 使用P ...
- Android开发之旅:组件生命周期(二)
引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...
- Android开发之SpannableString具体解释
在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...
- Android开发之2048安卓版
之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...
- android语音播放工具类,Android开发之MediaPlayer多媒体(音频,视频)播放工具类
本文实例讲述了Android开发之MediaPlayer多媒体(音频,视频)播放工具类.分享给大家供大家参考,具体如下: package com.android.imooc.chat; import ...
- Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)
鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio Android Studio 是一个Android开发环境,基于Intel ...
最新文章
- php正则表达式实例详解,正则表达式实例解析
- 张永伟 大数据会成为互联时代重要变革
- java final修饰属性_Java final关键字用来修饰类、方法、属性
- 计算机适配器有什么作用,例举适配器是什么
- [蓝桥杯]2019年第十届省赛真题C/C++ B组 填空+大题
- matlab计算macd_matlab计算MACD指标
- python获取参数
- 一名靠谱的JavaScript程序员应备的素质
- linux mount nfs 超时,I / O无法(偶尔)挂载NFS-服务器超时
- cisco ios cookbook
- 拓端tecdat|R语言使用随机技术差分进化算法优化的Nelson-Siegel-Svensson模型
- 【2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) F】Rectangles【扫描线】
- java 操作日志记录_高效日志系统搭建秘技!架构师必读
- 最新仿技术导航网源码 全开源自助友链系统
- 人教版四年级上次计算机教案,人教版四年级上册数学教案
- table 去掉td重复的边框_css怎么解决表格边框线重复问题
- 计算机与网络如何连接网络设置,电脑网络连接网络配置方法
- 一款精简的webshell管理工具 -- Assassin
- 三角函数公式合集——从诱导公式到求导公式
- 刘新华老师-沪师经纪
热门文章
- 【自我感悟致学弟学妹】大三上的感悟,何为真正优秀的人
- 【恋上数据结构】快速排序
- j2ee与mysql乱码过滤_J2EE中文乱码处理
- 深度剖析 | 基于大数据架构的BI应用
- 比_thread高级的threading模块,对比释放锁例子
- vue里面v-cloak/v-text/v-html/v-pre的应用
- dnf搬砖代码Python_DNF:95版本搬砖角色怎么提高移速,不花钱就花时间吧
- python如何打开npy文件_操作python实现npy格式文件转换为txt文件
- 洛谷 P1918保龄球
- 计算机网络 第六章 应用层