2013-04-12 60 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()來啓動它)