我阅读了大部分因数据库而导致内存泄漏的问题,但没有一个问题可以解决我的问题,因为每个人的实现都不同。
我的应用程序查询数据库,每个按键从数据库中获取数据并将其作为ArrayList返回。我正在使用AsyncTask在后台执行任务,以避免因等待结果而导致UI卡住。数据库在doInBackground
方法中实例化,并在执行后关闭,但仍然在LogCat中我看到了内存泄漏警告。
我在以下两个文件中关闭数据库:
DatabaseHelper.java
@Override
public synchronized void close() {
if (database != null) {
database.close();
}
super.close();
}
DatabaseManager.java
实例化DatabaseHelper
public void close() {
if(cursor != null) cursor.close();
if(db != null) db.close();
dbHelper.close();
}
我还检查以前关闭数据库:
public DatabaseManager(Context context) {
if(db != null) db.close();
this.mContext = context;
this.dbHelper = new DatabaseHelper(mContext, getDatabaseName());
this.db = dbHelper.openDatabase();
}
的AsyncTask:
private class SelectDataTask extends AsyncTask<String, Void, ArrayList<String>> {
private String subType;
void getSubtype(LatinKeyboard mCurKeyboard) {
if (mCurKeyboard == mQwertyKeyboard) {
subType = "english";
} else if (mCurKeyboard == mPashtoKeyboard) {
subType = "pashto";
} else {
subType = "farsi";
}
}
@Override
protected ArrayList<String> doInBackground(String... str) {
db = new DatabaseManager(getApplicationContext());
list = db.getAllRow(str[0], subType);
return list;
}
@Override
protected void onPostExecute(ArrayList<String> result) {
list = result;
setSuggestions(result, true, true);
db.close();
}
}
这是LogCat:
09-25 00:54:23.025 32497-32509 / com.xxx.xxx W / SQLiteConnectionPool:数据库的SQLiteConnection对象&gt; ++ data ++ data ++ xxxx_afghankeyboard ++ databases ++ xxx_sqlite&#39 ;被泄露了!请修复您的应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库。