0

我正在使用 SOAP Parsing 在 android 中。在我的应用程序中,有一点我必须下载大量数据,其中也存在字节数组类型的数据。

对于解决方案,我参考了链接非常大的 SOAP 响应 - Android - 内存不足错误,但无法了解它如何与我的肥皂对象一起使用。

我用来获取肥皂响应的方法如下:

public SoapObject taskDetail() {

    SoapObject result = null;

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    request.addProperty("ID", "4");
    request.addProperty("fromDate", "02/06/2013");       
        request.addProperty("toDate", "02/06/2013");

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

    envelope.dotNet = true;

    envelope.setOutputSoapObject(request);

    AndroidHttpTransport transport = new AndroidHttpTransport(URL);

    transport.debug = true;

    try {
        transport.call(SOAP_ACTION, envelope);

        result = (SoapObject)envelope.getResponse();

        for(int i=0; i<result.getPropertyCount(); i++) {
                SoapObject view_task_master = (SoapObject) result.getProperty(i);

        screen = view_task_master.getProperty("Screen").toString();
        Log.i("screen",screen);

        date = view_task_master.getProperty("Createddate").toString();
        Log.i("date",date);

    }




        } 
        catch (IOException e) {
            Log.i("IOException",e.getMessage());
        } 
        catch (XmlPullParserException e) {
            Log.i("XMLPullParserException",e.getMessage());
        }
            return result;
    }

我知道主要问题是由于数据量大,结果对象无法处理它。
请帮助...提前谢谢...!!

4

2 回答 2

2
  • 尝试使用 AynckTask 进行肥皂请求 - 因为它不需要太多堆内存

两种策略可帮助您解决此问题:

下载时将 SOAP XML 流直接保存到磁盘。不要将其存储在内存中。使用 SAX 样式的解析器对其进行解析,您不会将整个 DOM 加载到内存中,而是将其解析为块。根据您处理的 XML 类型,在代码中使用 SAX 解析器通常更难;您将不得不自己跟踪许多事情,并且您将无法从 DOM 树的一个部分“跳转”到另一个部分。但是内存消耗会低很多。

但是请注意,许多“高级”网络通信库通常将整个 XML DOM 加载到内存中,这里可能就是这种情况。您可能必须自己创建和管理 HTTP 连接,然后手动解析结果。

于 2013-04-12T14:06:20.963 回答
0

使用ContentHandler。当它找到包含数据的标签时,使用 characters() 方法从输入流中获取字符数组并将其写入文件或数据库。这样您就不需要将所有数据保存在 ram 中。(这是您的肥皂对象包含 BLOB 的情况的解决方案)

另请记住,AsyncTask 不是执行长时间运行的网络请求的最佳方式(如果您使用 execute() 启动它,目前只有一个 AsyncTask 可以在 3.0+ 上运行)

于 2013-04-13T16:05:59.880 回答