StrictMode总结
Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。
首先先整体介绍:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()//线程策略(ThreadPolicy).detectDiskReads()//检测在UI线程读磁盘操作.detectDiskWrites()//检测UI线程写磁盘操作.detectCustomSlowCalls()//发现UI线程调用的哪些方法执行得比较慢.detectResourceMismatches()//最低版本为API23 发现资源不匹配.detectNetwork() //检测在UI线程执行网络操作.penaltyDialog()//一旦检测到弹出Dialog.penaltyDeath()//一旦检测到应用就会崩溃.penaltyFlashScreen()//一旦检测到应用将闪屏退出 有的设备不支持.penaltyDeathOnNetwork()//一旦检测到应用就会崩溃.penaltyDropBox()//一旦检测到将信息存到DropBox文件夹中 data/system/dropbox.penaltyLog()//一旦检测到将信息以LogCat的形式打印出来.permitDiskReads()//允许UI线程在磁盘上读操作.build());StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()//虚拟机策略(VmPolicy).detectActivityLeaks()//最低版本API11 用户检查 Activity 的内存泄露情况.detectCleartextNetwork()//最低版本为API23 检测明文的网络.detectFileUriExposure()//最低版本为API18 检测file://或者是content://.detectLeakedClosableObjects()//最低版本API11 资源没有正确关闭时触发.detectLeakedRegistrationObjects()//最低版本API16 BroadcastReceiver、ServiceConnection是否被释放.detectLeakedSqlLiteObjects()//最低版本API9 资源没有正确关闭时回触发.setClassInstanceLimit(MyClass.class, 2)//设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露.penaltyLog()//与上面的一致.penaltyDeath().build());
一 线程策略
detectDiskReads()/detectDiskWrites操作示例:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskWrites().detectDiskReads().penaltyLog().build());strictReads();}private void strictReads(){File file = new File(Environment.getExternalStorageDirectory().getPath()+"/note.txt");FileInputStream inputStream = null;int r = -1;try {inputStream = new FileInputStream(file);while((r = inputStream.read()) != -1){}} catch (Exception e) {e.printStackTrace();}finally {if(inputStream != null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
detectCustomSlowCalls操作示例:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectCustomSlowCalls().penaltyLog().build());showCustomSlowCallFlag();showCustomSlowCall();}private void showCustomSlowCallFlag(){StrictMode.noteSlowCall("This is Andly");SystemClock.sleep(10002);}private void showCustomSlowCall(){SystemClock.sleep(10002);}
Log:(只有作了标记得才会打印log)
detectResourceMismatches操作示例:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectResourceMismatches().penaltyLog().build());showResourceMismatches();}private void showResourceMismatches() {TypedArray ta = getResources().obtainTypedArray(R.array.icons);int a = ta.getInt(0,0);}
这个没有打印log,不知道为什么。。
detectNetwork操作示例:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectNetwork().penaltyLog().build());strictNetWork();}private void strictNetWork(){try {URL url = new URL("http://www.baidu.com");HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();httpURLConnection.connect();httpURLConnection.setRequestMethod("GET");httpURLConnection.setReadTimeout(3000);httpURLConnection.setConnectTimeout(5000);int code = httpURLConnection.getResponseCode();} catch (Exception e) {e.printStackTrace();}}
log:
对于线程策略剩下的比较简单就不多说,然后介绍一下:使用penaltyDropBox想要看文件得信息只需要输入:
adb shell dumpsys dropbox (这里写data/system/dropbox目录下文件的名字) --print
二 VM策略
detectActivityLeaks操作示例:
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectActivityLeaks().penaltyLog().penaltyDropBox().build());new Thread(new Runnable() {@Overridepublic void run() {SystemClock.sleep(1000);}}).start();}
log:
log上面显示,实例创建了2个但是限制的是一个
detectLeakedClosableObjects操作示例:
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedClosableObjects().penaltyLog().penaltyDropBox().build());leakedClosableObj();}private void leakedClosableObj() {File newxmlfile = new File(Environment.getExternalStorageDirectory(), "/note.txt");try {newxmlfile.createNewFile();FileWriter fw = new FileWriter(newxmlfile);fw.write("Andly");//fw.close();} catch (IOException e) {e.printStackTrace();}}
setClassInstanceLimit操作示例:
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().setClassInstanceLimit(LimitClass.class, 2).penaltyLog().penaltyDropBox().build());classInstanceLimit();}private void classInstanceLimit() {classList.add(new LimitClass());classList.add(new LimitClass());classList.add(new LimitClass());classList.add(new LimitClass());classList.add(new LimitClass());classList.add(new LimitClass());}
log:
detectLeakedRegistrationObjects操作示例:
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedRegistrationObjects().penaltyLog().penaltyDropBox().build());leakeRegistion();}private void leakeRegistion() {receiver = new myReceive();IntentFilter filter = new IntentFilter();filter.addAction("com.andly.broadcast");registerReceiver(receiver,filter);}
log:
考虑倒关于版本兼容问题,因为按照上面的写法在2.3以下系统是没有问题的,但是在2.3以上的话,就会出错,所以应该采用以下方式来处理
try {Class clazz = Class.forName("android.os.StrictMode");ApplicationInfo info = getApplicationInfo();if((info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0){//可以使用严苛模式}else{//不可使用严苛}} catch (ClassNotFoundException e) {//StrictMode类不可用 用这种方法来判断是否再Android2.3以下}
StrictMode总结相关推荐
- Android 应用性能优化-StrictMode(严格模式)
为什么80%的码农都做不了架构师?>>> UI线程如果被阻塞5秒的话,那么应用程序此时就会弹出ANR的对话框,ANR对应用程序来说是一个很严重的问题. 如何防止应用程序出现AN ...
- 严苛模式 strictmode
参考链接 http://blog.csdn.net/brokge/article/details/8543145 一.严苛模式-虚拟机策略 虚拟机策略(VmPolicy)能检查内存泄漏,譬如,当关闭一 ...
- android 严苛模式,Android- 严苛模式(StrictMode)
写程序时,你应该始终假定下列两种情况: 网络很慢(你正在试图连接的服务器甚至可能没有响应): 文件系统的访问速度很慢. 结论就是,不应该在主线程内进行网络操作或访问文件系统,因为缓慢的操作会拖累系统的 ...
- Android严苛模式StrictMode使用与取消
StrictMode最常用来捕捉应用程序的主线程,报告与线程及虚拟机相关的策略违例.一旦检测到策略违例(policy violation),开发者将获得输出警告:包含了一个栈trace显示你的应用在何 ...
- [转]Android最佳实践之:StrictMode介绍
[IT168技术]最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写 ...
- 严苛模式(StrictMode)
Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益.那它都做什么呢?它将报告与线程及虚拟机相关 ...
- Android性能调优利器StrictMode
2019独角兽企业重金招聘Python工程师标准>>> 作为Android开发,日常的开发工作中或多或少要接触到性能问题,比如我的Android程序运行缓慢卡顿,并且常常出现ANR对 ...
- Android之严苛模式(StrictMode)
Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益.那它都做什么呢?它将报告与线程及虚拟机相关的策 ...
- React中的fragment和StrictMode
一.fragment 在之前的开发中,我们总是在一个组件中返回内容时包裹一个div元素: 我们又希望可以不渲染这样一个div应该如何操作呢? 使用Fragment Fragment 允许你将子列表分组 ...
- android strictmode有什么作用,Android 性能优化 之 StrictMode
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? StrictMode概述 StrictMode 是用来检测程序中违例情况的开发者工具.使用StrictMode,系统检测 ...
最新文章
- UI培训分享:导航栏UI设计规范及注意事项有哪些?
- 高压小功率三极管 MFV13001
- 泛函编程(19)-泛函库设计-Parallelism In Action
- 便携式计算机的工作原理,便携式计算机及控制该计算机的方法
- 笔记-信息系统开发基础-CMMI组织能力成熟度模型-连续式和阶梯式的分组
- VS Code 中有哪些好用的 Azure 插件?
- div无法触发blur事件解决的方法
- Windows as a Service(4)——使用Intune管理Windows10更新
- php判断搜索引擎来路,php实现判断访问来路是否为搜索引擎机器人的方法
- 量子纠缠,如何理解不确定性
- layer数据加载中,loading的显示
- windows7 系统下载(2)
- 传输rp文件到ftp服务器并通过浏览器访问html
- 平板电脑应用_机房巡检AI机器人是啥,工业平板电脑的应用如何体现
- 四级英语测试软件,英语四级必备软件推荐
- windows微软商店打不开代码0x80131解决方法
- 对于提高团队开会效率的看法
- 企业为提高团队协作,一般都会使用什么办公工具?
- CSharp中的集合与字典:不同数据量的内存占用情况
- 【图像去噪】基于matlab GUI均值+中值滤波图像去噪(含PNSR)【含Matlab源码 372期】