strictmode是android在API9后引入的检测影响应用运行流畅性的一种机制,例如我们都知道的主线程中不允许有网络操作这条规则就是严苛模式规则的一种。
<强> strictmode。java 强>这个类中设定了许多检测标志位例如<强> DETECT_NETWORK >强,还有许多点球标志位例如<强> PENALTY_NETWORK >强,检测标志位决定strictmode是否要对这项内容进行检测,点球标志位决定了在这项内容发生时是否要抛出异常(相当于一种惩罚机制,点球的意思就是惩罚)。
StrictMode类的作用之一就是对这些标志位进行管理,通过setThreadPolicy()方法可以设定政策变量中值的面具。
之后会将政策变量传入BlockGuard中,BlockGuard运行在Dalvik虚拟机中,对所有的异常操作进行统一的管理。
strictmode是一种开发工具,引入它可以使你发现在开发过程中产生的问题,并修复它们。
在应用程序的主线程中常有UI相关的操作和动画发生,strictmode可以在主线程中检测硬盘和网络相关的操作。将硬盘读写操作和网络相关操作挪出主线程可以使你的程序更加流畅和具有响应性。同时为了使应用程序更加响应性,你可以屏蔽ANR发生时弹出的对话框。
需要注意的是,尽管android设备的硬盘类型大多为闪存,建立在这种存储介质上的文件系统的并发性仍然是非常有限的(速度上肯定是RAM比较快)。
大部分情况下,硬盘的读写操作都是非常快的,但在某些情况下,后台进程中会运行耗费很大的I/O操作,在这种情况下,应用的响应速度会下降很多。
StrictMode类的文档中给出的StrictMode启动方式
*公共空间> 公共静态孔隙setThreadPolicy(最终ThreadPolicy政策){ setThreadPolicyMask (policy.mask); }
2。
在setThreadPolicyMask()方法中,除了在java层的threadLocal中设置外,还需要在本地层也进行一个设置只,
私有静态孔隙setThreadPolicyMask(最后一个int policyMask) {//除了java级别在Dalvik的线程局部//BlockGuard外,我们还需要保持原生线程局部//绑定为了跨绑定调用传播价值,//甚至跨独有的本地流程。两个保存在//同步通过回调>//设置政策Dalvik/libcore (BlockGuard) 私有静态孔隙setBlockGuardPolicy(最后一个int policyMask) { 如果(policyMask==0) { BlockGuard.setThreadPolicy (BlockGuard.LAX_POLICY); 返回; } 最后BlockGuard。政策政策=BlockGuard.getThreadPolicy (); 最后AndroidBlockGuardPolicy androidPolicy; 如果(政策instanceof AndroidBlockGuardPolicy) { androidPolicy=(AndroidBlockGuardPolicy)政策; 其他}{ androidPolicy=threadAndroidPolicy.get (); BlockGuard.setThreadPolicy (androidPolicy); } androidPolicy.setPolicyMask (policyMask); }
4。
再看原生层的代码:
设置了政策
386年空白IPCThreadState:: setStrictModePolicy (int32_t政策) 387年{ 388 mStrictModePolicy=政策; 389}
1。
CloseGuard检测游标是否正常关闭:
当使用ContentResolver来查询数据库的时候,会返回一个CursorWrapperInner类型的指针对象。
mCursor=mResolver。查询带来过度的负载,空,空,空,空),
CloseGuard对CursorWrapperInner是否正常关闭的检测的逻辑在finalize()函数中,finalize()方法会在gc执行垃圾回收的时候被调用(垃圾回收使用了GcRoot算法)
如果没有执行CursorWrapperInner的关闭()函数,仅将CursorWrapperInner对象置为空,当主动触发gc的时候(Systemgc ()), finalize()函数被调用,”光标完成事先关闭()”这段日志被打印。但如果没有将CursorWrapperInner对象置为空,这时主动触发gc并不会引起finalize()函数的执行,因为CursorWrapperInner对象被强引用,垃圾回收器在回收时不会考虑回收强引用对象,即使最后内存不足而崩溃。
经过测试程序的测试,发现“光标完成事先关闭()”这段日志在CursorWrapperInner对象置空并执行system . gc()后是会打印出来的。
但是CloseGuard中的warnIfOpen()函数始终没有执行
在CursorWrapperInner的构造函数中,mCloseGuard执行开放()函数,在开放函数中allocationSite被赋值,而使变量是默认为真实的,唯一改变它的setEnabled()方法在源码中也并没有被调用,所以应该是会在记者中打印SystemLog的,但最后SystemLog并没有打印,具体原因分析不出来只,,,,,,