大家好,在做Android应用开发的时候,从服务器下载XML数据并解析,以前用的是StringBuffer来append完成的,对于数据量比较小的,没有问题;但是数据量过大的时候就报OutOfMemory(比如我的大约6.8M),原因就是AbstractStringBuilder的enlargeBuffer方法在容量不够。
以前的从服务器下载xml数据并解析代码:
private String dataFromServer;
public Object connectToHttp_Get(String urlStr) {
try {
URL url = new URL(urlStr);
// 创建URL连接
// Proxy proxy = new Proxy(Proxy.Type.HTTP, new
// InetSocketAddress("61.152.126.138",22222));
URLConnection urlConnection = url.openConnection();
// 设置参数
urlConnection.setConnectTimeout(30 * 1000);
urlConnection.addRequestProperty("User-Agent", "J2me/MIDP2.0");
// 连接服务器
urlConnection.connect();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
InputStreamReader isr = new InputStreamReader(in, "GB2312");
BufferedReader rbr = new BufferedReader(isr);
StringBuffer rsb = new StringBuffer ();
String readLine = rbr.readLine();
while (readLine != null) {
rsb.append(readLine);
readLine = rbr.readLine();
}
dataFromServer=rsb.toString();
in.close();
isr.close();
rbr.close();
} catch (Exception e) {
e.printStackTrace();
}
return dataFromServer;
}
这样对于小容量的xml数据来说StringBuffer可以连接,也没有超过它本身的缓冲区,直接转换为String后再调用sax解析方法,是可行的。
下面贴一下对于从服务器下载数据量比较大的xml,就不能用上面的StringBuffer来进行拼接了:代码如下:
public String resolveBlobAVXml(String urlStr){
try {
URL url = new URL(urlStr);
URLConnection urlConnection = url.openConnection();
urlConnection.setConnectTimeout(30 * 1000);
urlConnection.addRequestProperty("User-Agent", "J2me/MIDP2.0");
urlConnection.connect();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
InputStreamReader isr = new InputStreamReader(in, "GB2312");
//BufferedReader rbr = new BufferedReader(isr);
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = null;
reader = factory.newSAXParser().getXMLReader();
reader.setContentHandler(new ResolveCustInoXml());// 解析类
reader.parse(new InputSource(isr));
in.close();
//isr.close();
//rbr.close();
} catch (Exception e) {
e.printStackTrace();
}
return downLoadSum+"-"+repeatSum;
}
解析时直接解析流,而不是转换为xmlString再进行解析.