1

嗨,我正在开发一个 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 之类的东西之前,我想知道是否有对上述方法的简单修复,或者我是否错过了一些简单的东西。

4

1 回答 1

0

我在互联网上搜索了很多您的替代解决方案。但似乎内存限制总是在手机的中间。

真的 1500 * 1000 像素的图像对于安卓手机来说太大了。在我的一个项目中,我也遇到了同样的问题。

唯一的方法是您可以在服务器端解析该字符串,临时存储它并传递图像路径作为响应。这是我现在感觉最好的方法。我仍在寻找解决方案。如果找到,我会告诉你。

您的上述方法会减慢移动速度,还会杀死后台运行的有用应用程序服务。:(

于 2013-08-29T12:24:38.563 回答