2016-11-12 83 views
0

我想调试我遇到的'内存不足'错误,所以为了浓缩我的示例以达到帮助的目的,我有一个按钮,点击它时查询该数据库并将所有值返回到ArrayList中,然后使用ArrayList来填充RecyclerView。这是成功的,但是如果我再次按下按钮,会发生“内存不足”错误。查询返回的数据量非常大,从日志中我可以看到,只需按下一次按钮,就没有太多的内存可用(在仿真器上运行)。我来到这个结论来自该行的日志中:Android的sqlite光标 - 内存不足

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

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

+0

你在myTable中有多少条记录? – developer

+0

'myTable'中有多少条记录?他们是否包含斑点?此外,'myArrayList.add(MyInfo);'是错误的(您添加类,而不是'myInfo'对象)。 – pathfinderelite

+0

@pathfinderelite我做了一个类型,我编辑了我的帖子。 – WizzKidd

回答

0

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

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

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