美文网首页
Android StrictMode Use

Android StrictMode Use

作者: 咚咚_Coding | 来源:发表于2021-12-06 10:28 被阅读0次
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()后是会打印出来的.

相关文章

网友评论

      本文标题:Android StrictMode Use

      本文链接:https://www.haomeiwen.com/subject/xyygxrtx.html