StrictMode(严格模式)

来源:互联网 发布:wind万德数据库官网 编辑:程序博客网 时间:2024/06/05 18:54

**前言:**Android2.3之后引入的一个新的调试特性,这个特性可大幅度提高 “应用性能” 。在debug模式开始时,可以开启,可以有效避免性能或其他问题。

策略有两种:(一般只能在调试环境中使用)
1. 与线程相关:只要在该线程中任意一个地方启动一次即可,就可以检测该线程是否存在违规行为,一般在需要检测的线程上调用该策略代码
2. 与内存相关:检测应用是否存在内存泄露问题,如:SQLite在关闭前就被丢弃,造成内存泄露,这时可以被检测出(区别:不支持通过对话框显示警告信息)
关闭StrictMode:(生产环境则需要把严格模式关闭了,避免由于警告造成应用强制关闭,体验不好)
方式一:定义一个全局的布尔变量,在生产时变为false,不让策略代码执行
方式二:使用标签的android:debuggable=”true”属性,在调试时手动设置为true,生产时手动设置为false,具体代码判断如下:

ApplicationInfo appInfo = instance.getApplicationInfo();int appFlags = appInfo.flags;if((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0){    //执行策略代码}

总结:都是控制策略代码不执行
封装策略代码:(要使用策略,推荐这种方式)
(说明:把策略的代码封装在一个类中,通过try/catch避免2.3之前版本不存在该类异常,如下调用使用与所有Android版本)

/** * 说明:严格模式的代码策略 * 作者:黄伟财 * 日期:2016-2-2 */public class StrictModeWrapper {    public static void init(Context context){        ApplicationInfo appInfo = context.getApplicationInfo();        int appFlags = appInfo.flags;        if((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0){            //检测线程的策略(根据情况可定义多种检测方向)            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()            .detectDiskReads()            .detectDiskWrites()            .detectNetwork()            .penaltyLog()            .build());            //检测内存的策略(根据情况可定义多种检测方向)            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()            .detectLeakedSqlLiteObjects()            .penaltyLog()            .penaltyDeath()            .build());        }    }}

启动严格模式的策略:

try {    StrictModeWrapper.init(this);} catch (Exception e) {    e.printStackTrace();}

另外:在2.3之前版本需要使用严格模式策略,那么可用如下反射方法,但不够灵活,只能调用系统存在的

try {    Class sMode = Class.forName("android.os.StrictMode");    Method enableDefaults = sMode.getMethod("enableDefaults");    enableDefaults.invoke(null);} catch (Exception e) {    e.printStackTrace();}

以上就是全部内容,大家可以自个去试试,有什么问题可以留言。或者在微信公众号“技术帮团队”上找我们。

0 0
原创粉丝点击