private void initStrictMode() {
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectCustomSlowCalls() //监测自定义运行缓慢函数
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog() //在Logcat 中打印违规异常信息
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectActivityLeaks()
.detectLeakedClosableObjects() //API等级11
.penaltyLog()
.build());
}
}
Policy 策略 penalty 惩罚
可以在主线程中检测硬盘和网络相关的操作.将硬盘读写操作和网络相关操作挪出主线程可以使你的app更加流畅和具有响应性.
https://m.jb51.net/article/132547.htm
线程策略
policy对象存储在threadLocal变量中(每个线程保存一个policy的对象),首次运行该方法会生成一个默认
policy(mMask=0)保存在threadLocal中,这里的policy对象是AndroidBlockGuardPolicy类型.
泄漏检测
CloseGuard对CursorWrapperInner是否正常关闭的检测的逻辑在finalize()函数中,finalize()会在gc执行
垃圾回收的时候被调用(垃圾回收使用了GcRoot算法)
如果没有执行CursorWrapperInner的close()函数,仅将CursorWrapperInner对象置为null,
当主动触发gc的时候( Systemgc()),finalize()函数被调用 ,"Cursor finalized without prior close()"
这段log被打印.但如果没有将CursorWrapperInner对象置为null,这时主动触发gc并不会引起 finalize()函数的执行,因为CursorWrapperInner对象被强引用,垃圾回收器在回收时不会考虑回收强引用对象,即使最后内存不足而崩溃
经过测试程序的测试,发现"Cursor finalized without prior close()"这段log在 CursorWrapperInner对象置空并执行 System.gc()后是会打印出来的.
网友评论