2012-11-01 57 views
4

我使用下面的代码来解析JSON字符串从网络获取,(30000条记录)的OutOfMemoryError而JSON解析Android中

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

类似的问题在这里解决 http://stackoverflow.com/questions/6173396/parse-data-of-size-about-3mb-using-json-in-android?rq=1 – tdgtyugdyugdrugdr

回答

1

如果数据文件太大,无法将其所有的读取到内存。

读一行,然后将其写入本机文件。不要使用StringBuilder来将所有数据保存在内存中。

0

尝试导入您的数据块,如1000条记录每次。希望你不会遇到这个问题。

3

Android为每个应用程序强加了一个内存上限(几乎所有手机都是16 MB,一些较新的平板电脑有更多)。应用程序应确保它们的实时内存限制低于该级别。

因此,我们无法保留一个大的字符串,比如超过1MB,因为应用程序的实时内存使用总量可能会超过此限制。请记住,总内存使用量包括我们在应用程序中分配的所有对象(包括UI元素)。

因此,您唯一的解决方案是使用Streaming JSON解析器,该解析器会根据数据处理数据。那就是你不应该在String对象中保持完整的字符串。一种选择是使用Jackson JSON parser

编辑:Android现在支持JSONReader从API级别11.从未使用过它,但它似乎去..

0

我解决了这个问题,此library的方式。 有一个很好的教程here

有了这个,你将绕过转换entity.getContent()为字符串,这将解决您的问题。

InputStream inputStream = entity.getContent(); 
JsonReader reader = Json.createReader(inputStream); 
JsonObject jsonObject = reader.readObject(); 
return jsonObject;