Android sqlite 游标 - 内存不足

Android sqlite cursor - out of memory

我正在尝试调试我遇到的 'out of memory' 错误,因此为了寻求帮助而压缩我的示例,我有一个按钮,单击它会查询数据库和 returns把所有的值放到一个ArrayList中,然后这个ArrayList被用来填充一个RecyclerView。这是成功的,但是如果我第二次按下按钮,就会出现 'out of memory' 错误。查询 returns 大量数据,从日志中我可以看到只需按一下按钮,就没有多少可用内存(在模拟器上为 运行)。我从日志中的这一行得出了这个结论:

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.

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

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;
}

我在这里研究过以前关于 SO 的文章,大多数答案都说游标必须在 finally 块中关闭。但是正如你在上面看到的,我已经在这样做了。

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

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

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