使用方法:
private boolean DEV_MODE = BuildConfig.STRICT_MODE;
@Override
public void onCreate() {
if (DEV_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyDialog() //弹出违规提示对话框
.penaltyLog() //在Logcat 中打印违规异常信息
.penaltyFlashScreen() //API等级11
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects() //API等级11
.penaltyLog()
.penaltyDeath()
.build());
}
super.onCreate();
如何解决检测出来的问题?
针对此问题下面给出几点建议,仅供参考:
1.如果是主线程中出现文件读写违例问题,建议使用工作线程(可采用HandlerThread,IntentService、线程池或直接new Thread,必要时可结合Handler)完成,但采用工作线程在某个Activity中操作时注意线程要能正常结束,否则将导致内存泄露,相关细节后文将有表述。
2.如果是对SharedPrefrences写入操作,在API 9以上建议优先调用apply而非commit,此外需注意的是确保SharedPrefrences在单进程中使用,如果涉及跨进程数据交换,建议自己编写跨进程SharedPrefrences实现机制,否则可能导致数据不准确。
3.如果存在未关闭的Closable对象,需根据对应的stacktrace进行关闭。
4.如果SQLite对象泄露,根据对应的stacktrace进行释放。
5.注意registerBroadcast和unregisterBroadcast配对使用,对文件操作完成后记得close操作。
StrictMode policy violation; ~duration=423 ms: android.os.StrictModeAndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1293)
网友评论