android strictmode有什么作用,Android StrictMode介绍
今天在阅读Wordpress for android 的源代码的时候看到这个。 之前项目中未曾用过,google了一下发现很有用。写篇blog记录下。/**
* enables "strict mode" for testing - should NEVER be used in release builds
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private static void enableStrictMode() {
// return if the build is not a debug build
if (!BuildConfig.DEBUG) {
AppLog.e(T.UTILS, "You should not call enableStrictMode() on a non debug build");
return;
}
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.penaltyFlashScreen()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectActivityLeaks()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.detectLeakedRegistrationObjects() //
.penaltyLog()
.build());
AppLog.w(T.UTILS, "Strict mode enabled");
}
Android平台中(Android
2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode)。这个类可以用来帮助开发者改进他们编写的应
用,并且提供了各种的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,比如可以监视那些本不应该在主线程中完成的工作或者其他的一些不规范和
不好的代码。
StrictMode有多种不同的策略,每一种策略又有不同的规则,当开发者违背某个规则时,每个策略都有不同的方法去显示提醒用户。在本文中,将举例子说明如何使用在Android 中使用 StrictMode。
StrictMode的策略和规则
目前,有两大类的策略可供使用,一类是关于常用的监控方面的,另外一类是关于VM虚拟机等方面的策略。常用的监控方面的策略有如下这些:
Disk Reads 磁盘读
Disk Writes 磁盘写
Network access 网络访问
Custom Slow Code 自定义的运行速度慢的代码分析
前面三种的意思读者应该很清楚,就是正如它们的名字所示,分别对磁盘的读和写,网络访问进行监控。而第四种的自定义慢代码分析,是仅当访问调用类的时
后才触发的,可以通过这种方法去监视运行缓慢的代码。当在主线程中调用时,这些验证规则就会起作用去检查你的代码。比如,当你的应用在下载或者解析大量的
数据时,你可以触发自定义运行速度慢代码的查询分析,作用很大。StrictMode可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调
用,可以帮助开发者使其改进程序,使主线程处理UI和动画在磁盘读写和网络操作时变得更平滑,避免主线程被阻塞的发生。
而VM方面的策略重点关注如下几类:
内存泄露的Activity对象
内存泄露的SQLite对象
内存泄露的释放的对象
其中,内存泄露的Activity对象和内存泄露的SQLite对象都比较好理解,而所谓对关闭对象的检查,主要是去监那些本该释放的对象,比如应该调用close()方法的对象。
当开发者违反某类规则时,每种策略都会有不同的方法令开发者知道当时的情况。相关的违反情况可以记录在LogCat中或者存储在DropBox中
(android.os.DropBox)服务中。而常用监控类的策略还会在当违规情况发生时显示相关的对话框和当时的上下文环境,所有的这些都为了能让
开发者尽快地了解程序的瑕疵,以提交程序的质量。
第一步 启用strictmode
为了能在应用中启用和配置StrictMode,开发者最好尽可能在应用程序的生命周期的早段使用,方法是调用StrictMode的方法
setThreadPolicy。当使用常用监控类的时候,一个最好的调用时机,是在应用中入口和activities被调用前进行。比如在一个应用程序
中,可以把代码放在启动Activity类的onCreate()方法中,下面是一个代码示例,启用了当前情况下的所有策略及规则,当程序中出现违背常用
的规则时,将会显示相关的提示信息窗口:StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDialog() 打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
.penaltyLog()
.build());
当然,以上代码只应在未发布上线的测试版本的应用中运行以方便监视相关的运行情况,当在生产版本上时不应该启用strictmode。因此,最佳的代码实践应该为如下的样子:public void onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build());
}
super.onCreate();
}
这里,执行了一些向磁盘快速读写的操作,最后又重新启用了这些规则。StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old)
.permitDiskWrites()
.build());
doCorrectStuffThatWritesToDisk();
StrictMode.setThreadPolicy(old);
StrictMode是一个十分有用的类,它可以很方便地应用于检查Android应用程序的性能和存在的问题。当开启这个模式后,开发者能很好地检查应用中存在的潜在问题,更多的请参考Android文档中的相关API说明。
android strictmode有什么作用,Android StrictMode介绍相关推荐
- android strictmode有什么作用,Android StrictMode运行流程(推荐)
什么是 StrictMode(严苛模式) strictmode是android在 API9后引入的检测影响app运行流畅性的一种机制,例如我们都知道的主线程中不允许有网络操作这条规则就是严苛模式规则的 ...
- android strictmode有什么作用,Android 性能优化 之 StrictMode
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? StrictMode概述 StrictMode 是用来检测程序中违例情况的开发者工具.使用StrictMode,系统检测 ...
- android strictmode有什么作用,Android StrictMode policy
问题 Running into some ANR issues with an android application so I implemented the StrictMode policies ...
- android strictmode有什么作用,Android严苛模式StrictMode使用详解
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的.举个例子来说,如果开发者在UI线程中进行了 ...
- android任务栈的作用,Android 启动模式以及任务栈
1.Android 主要包含4种启动模式,下面分别介绍四种启动方式的特点: 1)tandard 默认的启动模式,标准模式 每开启一个Activity,就会在栈顶添加一个Activity实例.多次间隔或 ...
- android 单例的作用,Android中单例模式的几个坑
先来看这样一个单例,稍微有点经验的同学可能都会说,这样的单例是非线程安全的.要加个volatile关键字才可以.class Singleton{ private static Sing ...
- android小部件的作用,Android 应用小部件的实现
有些时候,我们需要为自己的应用添加一个桌面小部件来显示一些简单但是关键的信息方便用户使用.应用小部件的视图是靠RemoteViews来展现的,而RemoteViews内只能放置一些简单的ViewGro ...
- android中uri的作用,Android UrlUri详细解析
概述 在项目开发中,有时会遇到解析Url.Uri的需求,要从中得到链接中的相应字段.参数等.有多种实现方式,在这里总结一下应用到的. URL与URI的区别 Uri - 统一资源标志符 Url - 统一 ...
- android so文件的作用,Android SO库
查看手机CPU架构: $adb shell $cat /proc/cpuinfo OnePlus6: AArch64 Processor rev 12 (aarch64) ➜ ~ adb shell ...
最新文章
- mysql中的执行计划_MySQL中的执行计划explain详解
- Android中的JSONObject和JSONArray的使用
- SQL SERVER 通用分页存储过程
- 自定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 一)...
- java AES 加密和linux解密
- oracle logminer java_Oracle logminer
- PHP5.6的安装与配置(win7)
- 黑马程序员——C语言基础 字符串
- 买车,给点建议和意见
- 考研数学预热(肖老师)-2019-12-21
- 计算机主机机箱结构图,带大家认识电脑主机拆开,内部结构
- 送人玫瑰,手有余香!
- 关于简单控件RadioButtonList的使用
- html 纵向滚动条,css设置纵向滚动条
- scrollViewDidEndDragging和scrollViewDidEndDecelerating有什么区别呢
- 【渝粤题库】广东开放大学 标准化专题讲座1 形成性考核
- 人物-作家-马克·吐温:马克·吐温
- Java多态 父类引用指向子类对象
- PreScan快速入门到精通第二十四讲3D车辆动力学模型
- jupyter中怎么把图形在一个单独的窗口显示_【一点小套路】手把手从安装Python到完成第一个数据分析项目...
热门文章
- CSON+CJSON,解析json数据更优雅?
- AcWing 342. 道路与航线 (连通块Dijkstra+拓扑序||spfa+slf优化)
- FindWindow、FindWindowEx、EnumWindows、EnumChildWindows使用详解
- url scheme
- 【转】安装 vim 配色方案 colorscheme 详解
- Java蓝桥杯19年第七题
- oracle 查询语句取别名,实用sql查询语句详解1:给列取别名、查询部分行、多列排序...
- 手把手教编译Lean大的OpenWrt(附Lienol先生 的PassWall和Tty228先生的Serverchan)
- 编程语言详细介绍c#消息提示框messagebox的使用
- 第二次博客作业--RecycleView控件