2015-05-01 56 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()); 

这将正确读取的所有记录。