【发布时间】:2013-02-08 00:20:33
【问题描述】:
我正在创建一个涉及从文件中读取数据的应用程序。该文件相对较大 (1.8 MB),正在从 onCreate 中的异步线程读取。应用程序第一次启动时,它加载得很好。但是,如果您单击返回按钮然后再次加载它,它会耗尽内存并崩溃(抛出 OutOfMemory 错误)。
如何让它使用尽可能少的内存和/或在完成后释放该内存?
文件读取代码(在异步类的doInBackground()方法中执行):
public ArrayList<String> createDataList() {
dataList = new ArrayList<String>();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(getAssets().open(
"text.txt")));
String data;
while ((data = br.readLine()) != null) {
dataList.add(data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close(); // stop reading
} catch (IOException ex) {
ex.printStackTrace();
}
}
return dataList;
}
编辑* 异步类:
private class loadData extends AsyncTask<Void, Void, ArrayList<String>> {
@Override
protected ArrayList<String> doInBackground(Void... arg0) {
dataList = createDataList();
return dataList;
}
protected void onPostExecute(ArrayList<String> result) {
super.onPostExecute(result);
// display first element in ArrayList in TextView as a test
}
}
我已经尝试根据我想要如何组织数据来拆分文件并将每个文本文件中的数据存储到单独的ArrayList 中,但我也遇到了内存问题。我还将所有数据存储到一个“主”ArrayList 中,然后在该“主”上调用一个方法将数据添加到适当的ArrayList(从“主”中删除/清除数据)它复制了)。
关于如何简化和减少内存影响的任何想法?
编辑**
Logcat:
这是从您单击后退按钮然后再次加载活动时开始的。以下只是生成的消息之一(详细):
【问题讨论】:
-
你需要这些数据做什么?方法返回后的dataList怎么办?
-
你确定 DataList 是罪魁祸首吗?您能否添加 logcat,以便我们可以查找可能显示正在发生的事情的其他消息?
-
@fd。我将向用户显示数据。通过交互,用户将能够显示更多(见我的编辑)。
-
@DigCamara 我很确定考虑到我现在只有一个
TextView来显示ArrayList的第一个元素作为测试以确保ArrayList是越来越多。 :) 不过我会放一些 logcat(给我一分钟把它放在这里)。 -
@DigCamara 我添加了 logcat 消息。
标签: android android-assets android-memory