SOAP中的SOAP解析时出现内存不足错误

时间:2013-04-12 13:17:05

标签: android parsing soap

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

对于解决方案,我已经引用了链接Very large SOAP response - Android- out of memory error,但无法了解它如何与我的soap对象一起使用。

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

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

我知道主要问题是因为大数据导致结果对象无法处理它 请帮忙...提前致谢... !!

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

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