OutOfMemoryError в приложении Android при вызове веб-службы

Пожалуйста помоги....

Я вызываю метод веб-службы, который возвращает большой мыльный объект, и получаю ошибку OutOfMemoryException.

Как я мог этого избежать? Есть ли способ сделать это?

SoapSerializationEnvelope envelope = new    SoapSerializationEnvelope(SoapEnvelope.VER11);           
envelope.dotNet=true;  
envelope.setOutputSoapObject(request);  
try  {     
    httpTransport.call(SOAP_ACTION, envelope);// Here I am getting error 
}   
catch(Exception e){} 

Я ценю любую помощь. С уважением, Леонардо


person user679203    schedule 28.05.2011    source источник


Ответы (2)


Устройства Android имеют очень маленький размер кучи (около 16 МБ), поэтому, если ваш ответ SOAP возвращает много данных, чтение и преобразование всех этих данных в объекты мыла может привести к тому, что ваше устройство выдаст ошибку нехватки памяти.

Я столкнулся с аналогичной проблемой, самый простой подход - сделать следующее

  1. Когда ваш ответ мыла будет получен, сохраните его как XML на диске.
  2. затем используйте синтаксический анализатор XML, чтобы получить любые данные, которые вы хотите из XML (создайте объекты или сохраните в БД)

Вот как я решил проблему: Очень большой ответ SOAP - Android - ошибка нехватки памяти

person Mukul Jain    schedule 21.06.2011
comment
это на случай большого отклика. А если у нас большой SOAP-запрос? У меня все еще есть эта проблема. - person xtr; 12.10.2011

Если вы получаете много данных, лучше всего использовать для этого поток. Используйте поток с диалоговым окном прогресса, это будет более удобно для пользователей, которым не придется ждать и видеть, что приложение «зависло» или что-то в этом роде.

Пример (просто чтобы показать вам, что я имею в виду, вам придется использовать его так, как вы хотите):

public class YourActivity extends Activity implements Runnable {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    // Your code...
    SoapSerializationEnvelope envelope = new    SoapSerializationEnvelope(SoapEnvelope.VER11);           
    envelope.dotNet=true;  
    envelope.setOutputSoapObject(request); 

    // Running the thread
    Thread thread = new Thread(this);
    thread.start();
}

@Override
public void run() {
    try  {     
        httpTransport.call(SOAP_ACTION, envelope);// Here I am getting error 
    }   
    catch(Exception e){} 
}

Удачи!

person Elad92    schedule 28.05.2011
comment
Elad92, спасибо за помощь, но это не сработало. У меня такая же ошибка в этой строке. Я действительно понятия не имею об этом. - person user679203; 30.05.2011