2015-05-01 57 views
1

我使用SQLite數據庫將數據存儲在我的應用程序中。下面是我如何訪問上的AsyncTask數據的樣本:OutOfMemoryError:沒有堆棧可用

ArrayList <Data> allMessages = new ArrayList<>(); 
String query = "SELECT * FROM .........."; 
SQLiteDatabase db = this.getWritableDatabase(); 
Cursor c = db.rawQuery(query, new String[]{username}); 
try { 
    if (c.moveToFirst()) { 
     do { 
      Data data = new Data(c.getString(0),.....) 
      allMessages.add(data); 
     } while (c.moveToFirst()); 
    } 
} finally { 
    c.close(); 
} 

在運行時,我得到這個異常:

java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:304) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available 

此刻,我的數據庫中包含類似20分的記錄,這是 - 我相信 - 不足以導致內存溢出...

感謝您的閱讀。

+4

'} while(c.moveToFirst());'這是一個無限循環。你只是讀第一張唱片,永遠 – njzk2

+2

你的意思是'} while(c.moveToNext());' –

+1

男人我不敢相信我沒有發現!非常感謝 :) – Rogue

回答

2

你的問題是,你只曾經讀取第一個記錄,因爲你用

} while (c.moveToFirst()); 

這將只讀取第一個記錄,你的ArrayList將填補了數以百萬計的第一個副本記錄..你最終會得到一個OutOfMemory錯誤。


相反,使用

} while (c.moveToNext()); 

這將正確讀取的所有記錄。