2016-11-12 10 views
0

私は経験している「メモリ不足」エラーをデバッグしようとしています。そのため、私の例を凝縮してヘルプを表示するために、ボタンをクリックしますdbを返し、すべての値をArrayListに戻します。次に、ArrayListを使用してRecyclerViewを生成します。これは成功ですが、もう一度ボタンを押すと「メモリ不足」エラーが発生します。クエリは非常に大量のデータを返し、ログからはボタンを1回押すだけで、エミュレータで実行されているメモリはそれほど多くないことがわかります。私は、ログ内のこの行から、その結論に達した:Android sqliteカーソル - メモリ不足

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

エラーが指している。先に説明したように、

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

と、ボタンの第2のプレスは、このエラーが発生します私のデータベースのヘルパークラス、具体的には、このコードセクション:

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ここではあえて記事を読んで、答えの大部分はカーソルがfinallyブロックで閉じなければならないと言っています。しかし、上記のように、私はすでにこれをやっています。

+0

myTableにはいくつのレコードがありますか? – developer

+0

'myTable'にはいくつのレコードがありますか?彼らはブロブを含んでいますか?また、 'myArrayList.add(MyInfo);'は間違っています( 'myInfo'オブジェクトではなくクラスを追加しています)。 – pathfinderelite

+0

@pathfinderelite私はタイプを作った、私は私の投稿を編集しました。 – WizzKidd

答えて

0

@antlersoftは私のRecyclerViewを埋めるために使用されたアダプタのデータをクリア/空にする必要があったため、正しい方向に私を指摘しました。

私は空のArrayListを作成するためのこの簡単な方法を思いつきました.MyViewAdapterのためにそれをRecyclerViewに使用しました。アダプターを空のArrayListで埋めると、ガーベッジ・コレクションは前のデータをクリーンアップして、次のフィルの準備が整った新しいプールを持つことができました。

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