我收到了巨大的JSON,而且在我阅读OutOfMemoryError行时出现。
这是我尝试解析JSON的第一个方法。
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8);
String result = "";
while (true) {
String ss = reader.readLine();
if (ss == null) {
break;
}
result += ss;
}
我也试过这种方法。
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ( (line = reader.readLine()) != null)
{
sb.append(line);
}
在这两种情况下都出现了OutOfMemoryErorr。
答案 0 :(得分:3)
答案 1 :(得分:3)
我找到的最佳解决方案是提高应用程序的堆。
我将android:largeHeap="true"
置于<application/>
的{{1}}下。
答案 2 :(得分:2)
当您实例化BufferedReader
时,传入int size
8
,意味着您的缓冲区为8个字符(我认为这不是您想要的)。如果您未传递size
,则默认值为8192个字符。
试试这个:
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
或者这个(同样的效果):
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8192);
http://developer.android.com/reference/java/io/BufferedReader.html
我不完全确定会修复您看到的错误,但如果您无法正常工作,请务必尝试。
答案 3 :(得分:1)
我的JSON代码正在等待状态,即将结束。所以我修改了代码以便早些时候返回。
// try to get formattedAddress without reading the entire JSON
String formattedAddress;
while ((read = in.read(buff)) != -1) {
jsonResults.append(buff, 0, read);
formattedAddress = ((String) ((JSONObject) new JSONObject(
jsonResults.toString()).getJSONArray("results").get(0))
.get("formatted_address"));
if (formattedAddress != null) {
Log.i("Taxeeta", "Saved memory, returned early from json") ;
return formattedAddress;
}
}
JSONObject statusObj = new JSONObject(jsonResults.toString());
String status = (String) (statusObj.optString("status"));
if (status.toLowerCase().equals("ok")) {
formattedAddress = ((String) ((JSONObject) new JSONObject(
jsonResults.toString()).getJSONArray("results").get(0))
.get("formatted_address"));
if (formattedAddress != null) {
Log.w("Taxeeta", "Did not saved memory, returned late from json") ;
return formattedAddress;
}
}