Android sqlite游标 - 内存不足

时间:2016-11-12 00:08:14

标签: java android sqlite cursor out-of-memory

我正在尝试调试我遇到的'内存不足'错误,所以为了寻求帮助而缩小我的示例,我有一个按钮,当点击它时查询数据库并返回所有值然后,在ArrayList中,ArrayList用于填充RecyclerView。这是成功的,但是如果我第二次按下按钮,则会发生“内存不足”错误。查询返回了大量的数据,从日志中我可以看到,只需按一下按钮,就没有太多可用的内存(在模拟器上运行)。我从日志中的这一行得出了这个结论:

com.wizzkidd.myapp D/dalvikvm: GC_FOR_ALLOC freed 1459K, 2% free 91444K/93016K, paused 40ms, total 40ms

并且,如前所述,第二次按下该按钮会出现此错误:

com.wizzkidd.myapp E/dalvikvm-heap: Out of memory on a 152-byte allocation.

错误指向我的数据库助手类,更具体地说,这段代码:

public List<MyInfo> getAllFromDb() {
    List<MyInfo> myArrayList= new ArrayList<MyInfo>();   
    String selectQuery = "SELECT * FROM myTable";
    SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
    Cursor cursor = sqLiteDatabase.rawQuery(selectQuery, null);
    try {
        if (cursor.moveToFirst()) {
            do {
                MyInfo myInfo = new MyInfo();                                      
                myInfo.setTitle(cursor.getString(0));
                myInfo.setDescription(cursor.getString(1));
                myArrayList.add(myInfo);
            } while (cursor.moveToNext());
        }
    } catch (Exception e) {
        Log.d(TAG, "Error while trying to get data from database");
    } finally {
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
    }
    return tvGuideInfoList;
}

我已经在这里研究了以前的文章,大多数答案说光标必须在finally块中关闭。但正如您在上面所看到的,我已经这样做了。

1 个答案:

答案 0 :(得分:0)

@antlersoft指出我正确的方向,因为我需要清除/清空用于填充我的RecyclerView的适配器中的数据。

我想出了这个快速的方法,它允许我为MyViewAdapter创建一个空白的ArrayList,然后我将它用于RecyclerView。我相信通过使用空白ArrayList填充适配器,它强制垃圾收集器清理以前的数据,从而允许我为下一次填充准备好新的内存池。

private void clearRecyclerView() {
        myViewAdapter = new MyViewAdapter(activity, new ArrayList());
        myRecyclerView.setAdapter(myViewAdapter);
        myViewAdapter.notifyDataSetChanged();
}