Android HttpClient内存不足错误(xml数据)
我在从XMLWeb服务读取大数据时遇到问题—xml文件大约为5.5Mb,代码崩溃并引发内存不足错误 这是我的功能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
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();
}