JSONObject.toString()返回OutOfMemoryError

我有一个Android应用程序。 首先,应用程序执行同步过程。 在此过程中,服务器向设备发送一个JSON对象作为String,通过它可以构建可用的问卷。

GetQuestionnairesResponse.java:

public class GetQuestionnairesResponse extends ResponseHandler { public GetQuestionnairesResponse(String result, AsyncRequest request) { super(result, request); } @Override public void handleResponse() { DataSyncActivity caller = (DataSyncActivity) request.getCaller(); BackgroundManager bckMng = BackgroundManager.getInstance(caller); PreferencesManager preference = PreferencesManager.getInstance(null); boolean status = true; int numOfWrongJsonVer = 0; int totalNumOfQuestionnaires = 0; // Handle data from server // Creating JSON Parser instance try { QuestionnaireDataSource questionnaireDS = new QuestionnaireDataSource(caller); questionnaireDS.open(); JSONArray jArr = new JSONArray(result); JSONObject j = null; totalNumOfQuestionnaires = jArr.length(); for (int i = 0; i < jArr.length(); i++) { j = jArr.getJSONObject(i); long questId = j.getLong("questionnaireId"); long surveyId = j.getLong("surveyId"); String questName = j.getString("name"); String desc = j.getString("description"); int version = j.getInt("questionnaireVersion"); int jsonVersion = j.getInt("jsonVersion"); if (jsonVersion == PreferencesManager.jsonVersion) { // Save the pages part String filename = questId + "_" + version + "_" + jsonVersion + ".json"; HelpFunctions.writeJSON(filename, j.toString()); Questionnaire quest = questionnaireDS.createQuestionnaire(questId, questName, desc, surveyId, version, jsonVersion, filename); if (quest == null) throw new RuntimeException("Cant save the questionnaire: " + questName); } else { numOfWrongJsonVer ++; } } questionnaireDS.close(); } catch (Exception e) { status = false; if (e.getMessage() != null) Log.e(TAG, e.getMessage()); } caller.setInSync(false); ... } 

我从服务器得到的结果我将它解析为Json数组。 在某些情况下,结果可能是3兆字节。

我找到的解决方案是在manifest.xml中添加一个属性:

  android:largeHeap="true" 

它解决了这个问题。 我不知道为什么但问题在最后一天又回来了。 我很乐意得到如何解决问题的建议。 问题是json对象没有按预期解析,所以它

如果JSON最初是3 MB而你在从它解析的JSONObject上调用toString() ,那么JSONObject仍然会占用内存,而且它需要进行3 MB的分配来保存String 。 你的内存可能不多。

但关于OutOfMemoryError的事情是,用尽最后一点RAM的分配并不一定要归咎于可用的RAM太少。 大量分配更有可能成为推动它超越优势的因素。 您的应用程序中的其他位置可能存在内存泄漏,您需要使用Eclipse MAT之类的工具来查找它。