我使用以下代码来解析从Web获取的JSON字符串,(30,000条记录)
DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost(params[0]);
httppost.setHeader("Content-type", "application/json");
InputStream inputStream = null;
String result = null;
HttpResponse response = null;
try {
response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
HttpEntity entity = response.getEntity();
try {
inputStream = entity.getContent();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"),8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
result = sb.toString();
我在下面的代码
中收到OutofMemory错误while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
如何消除此错误。当json字符串非常庞大时会发生此错误,因为它包含大约30,000条记录的数据。
对此方面的任何帮助表示高度赞赏。
答案 0 :(得分:3)
Android为每个应用程序设置了内存上限(几乎所有手机中都有16 MB,一些较新的平板电脑有更多)。应用程序应确保它们的实时内存限制保持在该级别以下。
因此,由于应用程序的总活动内存使用量可能超过该限制,因此我们无法持有一个大字符串,比如超过1MB。请记住,总内存使用量包括我们在应用程序中分配的所有对象(包括UI元素)。
因此,您唯一的解决方案是使用Streaming JSON解析器,该解析器随时获取数据。那就是你不应该在String对象中保持完整的字符串。一种选择是使用Jackson JSON parser。
编辑:Android现在支持来自API级别11的JSONReader。从未使用过它,但它似乎要走了......
答案 1 :(得分:1)
如果数据文件太大,则无法将其全部读取到内存中。
读取一行,然后将其写入本机文件。不要使用StringBuilder来保存内存中的所有数据。
答案 2 :(得分:0)
尝试以块的形式导入数据,例如每次1000条记录。希望你不会遇到这个问题。
答案 3 :(得分:0)