2013-04-12 58 views
0

内存错误而SOAP解析的,我在Android的SOAP解析工作。在我的应用程序中,有一点我必须下载大量数据,其中字节数组类型的数据也在那里。退房的Android

对于解决我刚才提到的链接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; 
    } 

我知道主要的问题是,由于大数据的结果对象不能处理它。
请帮助...在此先感谢...!

+0

而不是使用SOAP使用jSON来解析大数据。 – onkar

+0

@onkar + 1,但你不总是有控制服务实施... – fiddler

+0

@onkar ...感谢您的评论...但我不能使用JSON来解析数据,因为我得到了我的答复在XML格式。 –

回答

2
  • 尝试使用AynckTask的SOAP请求 - 因为它并不需要太多的堆内存

两种策略来帮助你解决这个问题:

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

拿笔记,但是,许多“高层次”的网络通信库通常加载在内存中的整个XML DOM,这可能是这里的情况。您可能必须自己创建和管理HTTP连接,然后手动分析结果。

+0

@Prabu ...感谢您的回答......在我的应用程序中,我必须多次执行SOAP请求,并且每次使用Asynctask任务时都处理得很好。但是现在我的xml响应太大了,这就是为什么会出现内存不足的问题。 –

0

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

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