美文网首页
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