如何正确关闭数据库以避免Android应用程序中的内存泄漏?

时间:2017-09-25 02:03:54

标签: java android memory-leaks android-asynctask

我阅读了大部分因数据库而导致内存泄漏的问题,但没有一个问题可以解决我的问题,因为每个人的实现都不同。

我的应用程序查询数据库,每个按键从数据库中获取数据并将其作为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 ;被泄露了!请修复您的应用程序以正确结束正在进行的事务,并在不再需要时关闭数据库。

0 个答案:

没有答案