Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android HttpClient内存不足错误(xml数据)_Android_Httpclient_Out Of Memory - Fatal编程技术网

Android HttpClient内存不足错误(xml数据)

Android HttpClient内存不足错误(xml数据),android,httpclient,out-of-memory,Android,Httpclient,Out Of Memory,我在从XMLWeb服务读取大数据时遇到问题—xml文件大约为5.5Mb,代码崩溃并引发内存不足错误 这是我的功能 private static HttpResponse executePostHttpRequest(String baseUrl, String names[], String values[]) throws ClientProtocolException, IOException { final HttpClient client = newHttpClientI

我在从XMLWeb服务读取大数据时遇到问题—xml文件大约为5.5Mb,代码崩溃并引发内存不足错误

这是我的功能

 private static HttpResponse executePostHttpRequest(String baseUrl,
  String names[],
  String values[]) throws ClientProtocolException,
  IOException {
final HttpClient client = newHttpClientInstance();
HttpPost request = new HttpPost(baseUrl);

boolean haveData = (names != null) && (values != null);

// if we have data, form it into request
if (haveData) {

  List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(values.length);

  for (int i = 0; i < values.length; i++) {
    nameValuePairs.add(new BasicNameValuePair(names[i], values[i]));
  }

  try {
    request.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8"));
  } catch (UnsupportedEncodingException e) {
    request.setEntity(new UrlEncodedFormEntity(nameValuePairs));
  }
}

request.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
// return response created by executing this request
return client.execute(request);

有什么建议吗?

压缩xml,文本压缩得很好,我也遇到了类似的问题(JSON而不是xml),它不仅解决了我的内存问题,还使应用程序速度加快了一百万倍

在我的例子中,JSON字符串从5MB更改为200kb


朝这个方向看:

尝试直接读取实际的输入流。这将允许您使用,这意味着您不必在解析整个XML文件时将其保存在内存中。拉式解析的工作原理是,在获得元素后立即对其进行解析,并依靠状态(如SAX解析器)跟踪您所在的位置。这是一个需求概念,让您可以将xml文件视为一个xml标记流

你会想做如下事情:

URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
  InputStream in = new BufferedInputStream(urlConnection.getInputStream());
  XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  factory.setNamespaceAware(true);
  XmlPullParser parser = factory.newPullParser(); 
  parser.setInput(new InputStreamReader(in));
  XmlUtils.beginDocument(parser,"results");
  int eventType = parser.getEventType();
  do{
    XmlUtils.nextElement(parser);
    parser.next();
    eventType = parser.getEventType();
    if(eventType == XmlPullParser.TEXT){
      Log.d("test",parser.getText());
    }
    //...Handle other types of events...
  } while (eventType != XmlPullParser.END_DOCUMENT) ;
}
finally {
  urlConnection.disconnect();
} 

我从和中拼凑了那个例子。不过,我还没有真正尝试过它,看看它是否管用。

对于Android 3.0+,你可以试试看,zipping真的能帮到他吗?难道他最终不需要解压它吗?然后它的内存将膨胀到5MB,并再次给他带来另一个内存不足错误?感谢您的帮助,但您的解决方案需要我修改大量依赖于我的httpUtils类的代码,所以我决定使用XMLPullParser直接读取Xml流,并通过httpUtils类进行Bay。再次感谢
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
  InputStream in = new BufferedInputStream(urlConnection.getInputStream());
  XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  factory.setNamespaceAware(true);
  XmlPullParser parser = factory.newPullParser(); 
  parser.setInput(new InputStreamReader(in));
  XmlUtils.beginDocument(parser,"results");
  int eventType = parser.getEventType();
  do{
    XmlUtils.nextElement(parser);
    parser.next();
    eventType = parser.getEventType();
    if(eventType == XmlPullParser.TEXT){
      Log.d("test",parser.getText());
    }
    //...Handle other types of events...
  } while (eventType != XmlPullParser.END_DOCUMENT) ;
}
finally {
  urlConnection.disconnect();
}