嗨,我正在开发一个 android 应用程序,该应用程序依赖于能够从我们的服务器获取其他数据中的图像,即图像包含在标签中作为响应的一部分。与服务器的通信基于 WCF 和 SOAP。
直到我们需要获取图像为止,它都运行良好。但是当我们需要从服务器获取图像时,应用程序在解析来自服务器的包含图像的响应时会花费大量时间并消耗大量内存。我们使用的图像通常大小为 1500 x 1000 像素。图像本身作为 base64 编码的字节数组传输。
目前我们正在使用 DOM xml 解析器解析响应,我知道这很容易消耗大量内存,但到目前为止还没有出现任何问题(除了解析图像)。此外,使用 XMLPull(似乎是 android 平台上推荐的 XML 解析器)的一些小测试已经解决了几乎相同的问题,即巨大的内存和时间消耗。
我怀疑问题源于图像被转换为字符串或字节数组,考虑到图像的大小,这两者都应该消耗相当多的内存。
Bellow 是我们目前用来解析响应的代码示例:
public static Document parseResponse(InputStream response)
{
Document parsedResponse = null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
parsedResponse = builder.parse(response);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return parsedResponse;
}
使用以下代码使用 Async-Task 获取响应:
protected Document doInBackground(ServerRequest... requests) {
ServerRequest request = requests[0];
HttpPost postRequest = request.postMethod;
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 10000);
HttpConnectionParams.setSoTimeout(httpParams, 10000);
DefaultHttpClient client = new DefaultHttpClient(httpParams);
HttpResponse response = null;
try {
response = client.execute(postRequest);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Document parsedResponse = null;
try {
InputStream stream = response.getEntity().getContent();
parsedResponse = ServerRequest.parseResponse(stream);
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return parsedResponse;
}
目前不可能使用 URL 来获取图像本身,即它作为 XML 的一部分来自服务器,否则像Android Hive 之类的东西 - 带有图像和文本的自定义 ListView可能是要走的路。
在深入研究 kSOAP2 之类的东西之前,我想知道是否有对上述方法的简单修复,或者我是否错过了一些简单的东西。