您好我正在从JSON解析数据。在解析数据时,我收到OUT OF MEMORY错误和dalvik-heap。如何摆脱这个问题。我在网上搜索我没有找到任何解决方案请帮助我。
提前致谢
03-06 08:19:00.618:E / dalvikvm-heap(1415):2506782字节分配的内存不足。
JSONObject jsonObj1 = new JSONObject(jsonStr1);
ArrayList<String> matter1= new ArrayList<String>();
String stat = jsonObj1.getString(TAG_stat);
String suc=jsonObj1.getString(TAG_success);
// Getting JSON Array node
matter = jsonObj1.getJSONArray(TAG_mdata);
// looping through All Contacts
dbdata =new ArrayList<String>();
for (int i = 0; i < matter.length(); i++) {
JSONObject j = matter.getJSONObject(i);
String ddesc= j.getString(TAG_ddesc);
String spd= j.getString(TAG_sped);
String gzid=j.getString(TAG_geozid);
String dev = j.getString(TAG_devid);
matter1.add(stat);
matter1.add(suc);
Log.v("contact", ""+matter1);
dbdata.add(ddesc);
dbdata.add(spd);
dbdata.add(gzid);
dbdata.add(dev);
dbdata1.add(dbdata);
答案 0 :(得分:0)
关于这一点的一个奇怪的事情是崩溃只发生在应用程序运行的第二次或第三次,让我相信每次应用程序关闭时应用程序消耗的内存都不会被垃圾收集。
这当然是可能的,如果是这种情况,那么可能是由于内存泄漏可以追溯到您的应用程序正在做的事情。我认为你应该把你最初的努力集中在调查这个方面......而不是将文件加载到块中。 (我不熟悉Android工具链,但我确信它包括内存使用情况分析器或内存转储分析器。)
修改
在回复您的后续评论时,它在3中工作2次的事实表明您的应用应该按原样工作。不可否认,如果输入文件变大,你没有太多余地。
但有几个想法:
不是将文件读入String并在String上运行JSON解析器,而是使用可直接从流中读取的解析器。在进行解析时,您当前的解决方案需要在内存中存储两个完整数据副本的空间。
如果文件变得更大,您可能需要考虑一种不能创建完整的内存中数据表示的设计。
我不确定在“块”中读取JSON文件是个好主意。这可能会给解析JSON带来问题......取决于你读取块的确切含义。
答案 1 :(得分:0)
使用Gson库。将优化您的所有流程。