我使用SQLite数据库将数据存储在我的应用程序中。这是我如何在asynctask上访问数据的示例:

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条记录,我相信这还不足以导致内存溢出...

谢谢阅读。

最佳答案

您的问题是您只读过第一条记录,因为您使用

} while (c.moveToFirst());


这只会读取第一条记录,并且您的ArrayList将充满第一条记录的数百万个副本。最终,您将得到OutOfMemory错误。



相反,使用

} while (c.moveToNext());


这将正确读取所有记录。

关于android - OutOfMemoryError:无可用堆栈,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29989162/

10-09 12:47