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