StrictMode作用:
是用来检测程序中违例情况的开发者工具。
小白主要用于监测内存泄漏
检查策略
两种:线程策略【ThreadPolicy】和虚拟策略【VmPolicy】
代码如下:
代码位置
严格模式的开启可以放在Application或者Activity以及其他组件的onCreate方法
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode 自定义的耗时调用
.detectDiskReads() //磁盘读取操作
.detectDiskWrites() //磁盘写入操作
.detectNetwork() //网络操作
// .penaltyDialog() //弹出违规提示对话框
.detectAll()
.penaltyLog() //在Logcat 中打印违规异常信息
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectAll()
.detectActivityLeaks() //Activity泄露
.detectLeakedSqlLiteObjects() //泄露的Sqlite对象
.setClassInstanceLimit(this.getClass(), 1) //检测实例数量
.penaltyLog()
.build());
解决问题记录:
1:实例对象重复问题
2:UI线程有耗时操作检测
3 在base中使用Toast一定要使用getApplication
//错误写法
@Override
public void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
//正确写法
@Override
public void showToast(@StringRes int resId) {
Toast.makeText(getApplicationContext(), resId, Toast.LENGTH_SHORT).show();
}
4:读取SharedPreferences中文件,也要使用全局applicationContext为参数
5:异步操作一定要使用弱引用,防止内存泄漏
6 application注意只能实例一次,即系统系统就会自动创建,最好不要在new
7 在读取系统服务(Service)创建一次就行。
8 List对象和handler对象在当前活动activity最好结束时最好销毁。