StrictMode --严格模式
主要作用是检测android性能,查看UI线程的操作,是否存在读写数据,数据库操作,联网操作等,如果有,则会控制返回警告log,或者直接停止运行游戏来处理。
一般用于性能需求高的应用或者作者要求高的应用研发阶段,当发布版本的时候一般都取消此操作。
【用法如下】
在android应用activity的onCreate中添加固定接口即可。(官方提供使用方法如下)
* public voidonCreate() { * if (DEVELOPER_MODE) { * StrictMode.setThreadPolicy(new {@linkThreadPolicy.Builder StrictMode.ThreadPolicy.Builder}() * .detectDiskReads() * .detectDiskWrites() * .detectNetwork() // or .detectAll() for all detectableproblems * .penaltyLog() * .build()); * StrictMode.setVmPolicy(new {@linkVmPolicy.Builder StrictMode.VmPolicy.Builder}() * .detectLeakedSqlLiteObjects() * .detectLeakedClosableObjects() * .penaltyLog() //错误的警告打印 * .penaltyDeath() //直接杀掉应用 * .build()); * } * super.onCreate(); * }
知道用法,我们查询下源码,到底做了什么。
1.首先看下StrictMode.setThreadPolicy,StrictMode.setVmPolicy
2.了解状态是什么如何获取到这些状态
//读: public Builder detectDiskReads() { return enable(DETECT_DISK_READ); } //写: public BuilderdetectDiskWrites() { return enable(DETECT_DISK_WRITE); } //联网: public Builder detectNetwork() { return enable(DETECT_NETWORK); } //操作数据库: public BuilderdetectLeakedSqlLiteObjects() { return enable(DETECT_VM_CURSOR_LEAKS); }
还有耗时操作等,此处不一一赘述.常量意义:
public staticfinal int DETECT_DISK_WRITE = 0x01; //for ThreadPolicy public staticfinal int DETECT_DISK_READ = 0x02; //for ThreadPolicy public staticfinal int DETECT_NETWORK = 0x04; // forThreadPolicy
从上面代码发现都所把自己以常量参数传递给enable函数处理,该函数做了什么呢,我们一起在分析下
private Builder enable(int bit) { mMask |=bit; returnthis; }
原来所通过二进制算法获取到一个状态的标示
全局搜索,发现包括penaltyLog ,penaltyDeath在内都是通过enable(),来实现标示状态的
3.build()函数做了什么呢