详解Android StrictMode严格模式的使用方法

所属分类: 软件编程 / Android 阅读数: 65
收藏 0 赞 0 分享

Android 2.3提供一个称为严苛模式StrictMode的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。那它都做什么呢?它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例policy violation,你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。你可以强制用警告代替崩溃crash,也可以仅将警告计入日志让你的应用继续执行。StrictMode是一个十分有用的类,它可以很方便地应用于检查Android应用程序的性能和存在的问题。当开启这个模式后,开发者能很好地检查应用中存在的潜在问题。

StrictMode分为以下两种策略:

1. 线程监控策略

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
          .detectDiskReads() 
          .detectDiskWrites() 
          .detectNetwork() 
          .detectAll() 
          .penaltyLog() 
                    //penaltyDeath() 
          .build());  

(1)setThreadPolicy():将对当前线程应用该策略 

(2)detectDiskReads():监控磁盘读 

(3)detectDiskWrites():监控磁盘写 

(4)detectNetwork():监控网络访问 

(5)detectAll():检测当前线程所有函数 

(6)penaltyLog():表示将警告输出到LogCat,你也可以使用其他或增加新的惩罚(penalty)函数,例如使用penaltyDeath()的话,一旦StrictMode消息被写到LogCat后应用就会崩溃。 

你不需要频繁打开严苛模式,你可以在Activity的onCreate()函数中打开它,你也可以在Application派生类的OnCreate()函数中设置严苛模式。线程中运行的任何代码都可以设置严苛模式(StrictMode),但你的确只需要设置一次,一次就够了。

2.VM虚拟机监控策略

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 
  .detectLeakedSqlLiteObjects() 
  .detectAll() 
  .penaltyLog() 
  //.penaltyDeath() 
  .build()); 

VM略重点关注如下几类:

(1)内存泄露的Activity对象

(2)内存泄露的SQLite对象

(3)内存泄露的其他任何类似可关闭对象

内存泄露的Activity对象和内存泄露的SQLite对象都比较好理解,而所谓“其他任何类似可关闭对象”的检查,主要是去监那些本该释放的对象,比如应该调用close()方法的对象。

3. 应该说大部分由StrictMode产生的规则警示都应去遵守,但有时也不是所有产生的信息都表明你的程序有错误。比如,在应用程序的主线程中去快速读写磁盘其实不会对应用的性能产生太大的影响,又或者你在调试程序阶段有一些调试的代码违反了设定的规则,这些都可以忽略掉这些规则。

忽略规则有两种方法,一种是单纯在代码中把Strictmode的代码注释掉,另外一种比较好的方法是,在需要忽略的时候和地方,增加相应的代码去让系统停止使用这些规则去检查,等开发者认为有必要检查时,再重新应用这些规则,比如:

StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy(); 
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old) 
  .permitDiskWrites() 
  .build());  
//TODO: do write something to disk 
StrictMode.setThreadPolicy(old); 

这里首先用old来保存了当前的策略规则,然后do write something to disk;这里执行了一些向磁盘快速读写的操作,最后又重新启用了这些规则。

以上所述是小编给大家介绍的Android StrictMode严格模式的使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多