【问题标题】:Parse large image from SOAP/XML in android在 android 中从 SOAP/XML 解析大图像
【发布时间】:2013-08-29 11:58:07
【问题描述】:

您好,我正在开发一个 android 应用程序,该应用程序依赖于能够从我们的服务器获取图像以及其他数据,即图像包含在标签中作为响应的一部分。与服务器的通信基于 WCF 和 SOAP。

直到我们需要获取图像为止,它都运行良好。但是当我们需要从服务器获取图像时,应用程序在解析来自包含图像的服务器的响应时会花费大量时间并消耗大量内存。我们使用的图像通常大小为 1500 x 1000 像素。图像本身作为 base64 编码的字节数组传输。

目前我们正在使用 DOM xml 解析器解析响应,我知道这很容易消耗大量内存,但到目前为止没有出现任何问题(除了解析图像)。此外,使用 XMLPull(似乎是 android 平台上推荐的 XML 解析器)的一些小测试已经解决了几乎相同的问题,即巨大的内存和时间消耗。

我怀疑问题源于图像被转换为​​字符串或字节数组,考虑到图像的大小,这两者都应该消耗相当多的内存。

下面是我们目前用来解析响应的代码示例:

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;
}

然后使用以下代码使用异步任务获取响应:

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 - Custom ListView with Image and Text 之类的东西可能是要走的路。

在深入研究 kSOAP2 之类的东西之前,我想知道是否有对上述方法的简单修复,或者我是否遗漏了一些简单的东西。

【问题讨论】:

    标签: android xml image wcf soap


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的快速回答,至少我认为解析字符串服务器端是不可行的,因为解析后的字符串将作为 XML 再次传输,然后应该读取并存储在内存中。我认为 Android Hive 的链接/URL 方法是最简单的解决方案。关于图片尺寸我同意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2016-03-28
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多