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

作者:苍痕 时间:2023-09-14 17:03:39 

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严格模式的使用方法网站的支持!

来源:http://blog.csdn.net/wangbaochu/article/details/50396629

标签:android,strictmode,严格模式
0
投稿

猜你喜欢

  • Java Scanner 类的使用小结

    2023-11-29 00:50:39
  • Spring Boot集成Ehcache缓存解决方式

    2023-05-13 08:27:27
  • java中如何判断JSONObject是否存在某个Key

    2022-06-10 15:07:24
  • 使用Java构造和解析Json数据的两种方法(详解一)

    2023-01-26 01:51:18
  • Hibernate实现批量添加数据的方法

    2023-11-29 08:53:56
  • 如何清空文件夹里面的所有文件和文件夹

    2022-09-17 04:11:06
  • Java中常见的对象转换工具

    2023-12-14 19:23:16
  • Java TCP网络通信协议详细讲解

    2022-09-26 09:04:22
  • C#实现温度转换功能

    2021-10-06 22:54:18
  • C#如何通过probing指定dll寻找文件夹详解

    2023-07-22 12:59:37
  • Spring Cloud中Sentinel的两种限流模式介绍

    2021-11-22 00:38:10
  • Android 虚拟按键与沉浸式的适配方法

    2021-11-27 22:03:02
  • Android Gradle同步优化详解

    2023-09-20 18:17:48
  • 详解c# 中的DateTime

    2023-05-15 01:48:58
  • Java 中 String,StringBuffer 和 StringBuilder 的区别及用法

    2023-08-22 16:40:57
  • c#检测端口是否被占用的简单实例

    2022-08-10 01:45:49
  • Android RecyclerView网格布局示例解析

    2023-03-04 00:49:44
  • 浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)

    2023-06-09 18:57:49
  • Android自动播放Banner图片轮播效果

    2022-09-06 05:55:42
  • C#中Dispose和Finalize方法使用介绍

    2022-09-10 16:05:21
  • asp之家 软件编程 m.aspxhome.com