android sqlite 内存泄漏的问题解决

    今天接收别人的一个项目的代码,解析文本数据存入数据库老是没有解析完就结束了,

 查看logcat的打印日志,报异常 db was leaked。但是不清楚具体是在哪里崩的,所以就启用strictmode模式查看

在相应的activity里加上,

		StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
		                    .detectLeakedSqlLiteObjects()
		                    .detectLeakedClosableObjects()
		                    .penaltyLog()
		                    .penaltyDeath()
		                    .build());

果然,报错,提示就只说某个东西没有关闭,

我感觉就两个原因,一个数据库打开后没有关闭,一个就是cursor没有关闭,检查他的代码,又在所有的finally里面把cursor关闭,但是还是报错。

最后查看他的获取SQLiteOpenHelper的代码,果然

他用的是单例模式打开数据库

代码是这样的

	public synchronized static SQLiteOpenHelper getInstance(Context context,String databasepath) {
		if (mIntances == null || !dbPath.equals(databasepath)) {
			mIntances = new DataBaseHelper(context, databasepath,
					null, VERSION);
			dbPath=databasepath;
		}
		return mIntances;
	}
根据传来的数据库地址打开数据库,而且这个类被所有的Dao使用,如果传来的路径和之前的不一样,他就new一个回去,但是忘了再new之前把当前正在打开的数据库给关了。

然后我就把代码改了一下,改成下面这个:

之后logcat就没有报错了,感觉问题应该是解决了,接触android没多久,好多都还要学啊

public synchronized static SQLiteOpenHelper getInstance(Context context,String databasepath) {
		if (mIntances == null) {
			mIntances = new DataBaseHelper(context, databasepath,
					null, VERSION);
			dbPath=databasepath;
		}else{
			if(!dbPath.equals(databasepath)){
				mIntances.close();
				mIntances = new DataBaseHelper(context, databasepath,
						null, VERSION);
				dbPath=databasepath;
			}
		}
		
		return mIntances;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值