2013-04-12 2 views
0

Я работаю с SOAP-анализом в android. В моем приложении есть один момент, когда мне приходится загружать большое количество данных, где также есть тип данных массива байтов.Ошибка памяти во время анализа SOAP в android

Для решения я упомянул ссылку Very large SOAP response - Android- out of memory error, но не смог получить, как она может работать с моим мыльным объектом.

Метод, который я использую, чтобы получить ответ мыло выглядит следующим образом:

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 поток XML непосредственно в диск при его загрузке. Не храните его в памяти. Разбирайте его с помощью синтаксического анализатора SAX, где вы не загружаете весь DOM в память, а скорее разбираете его в кусках. В зависимости от вида XML, который вы обрабатываете, использование синтаксических анализаторов SAX обычно сложнее в коде; вам придется самому отслеживать многие вещи, и вы не сможете «прыгать» из раздела в раздел вашего дерева DOM. Но потребление памяти будет ниже.

Обратите внимание, что многие «высокоуровневые» сетевые коммуникационные библиотеки обычно загружают всю память XML в память, что может иметь место здесь. Вам, вероятно, придется самостоятельно создавать и управлять HTTP-соединением, а затем вручную анализировать результат.

+0

@Prabu ... Спасибо за ответ ... В моем приложении я должен делать SOAP-запрос столько раз и каждый раз, когда я работаю с задачей Asynctask и ее работой. Но в это время мой xml-ответ слишком велик, поэтому проблема с памятью возникла. –

0

Использование ContentHandler. Когда он находит тег, который содержит данные, используйте метод characters(), чтобы получить массив символов из входного потока и записать его в файл или базу данных. Таким образом, вам не нужно хранить все данные в ram. (это решение для случая, когда ваш объект с мылом содержит BLOB)

Также имейте в виду, что AsyncTask - это не лучший способ выполнять длительные сетевые запросы (только один AsyncTask может работать в настоящий момент на 3.0+, если вы начинаете с execute())

Смежные вопросы