Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.outofmemory error (web services) on android

I am using simple web services to access the data from the database which is on the server. I am using android api10 but when running the code I get an error java.lang.OutOfMemoryError.

My code is:

package com.android.webservicesdemo;

import java.util.ArrayList;
import java.util.HashMap;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class androidactivity extends Activity {
    /** Called when the activity is first created. */

    private static String SOAP_ACTION1 = "http://tempuri.org/getAllDealsbyCategorySer";
    private static String NAMESPACE = "http://tempuri.org/";
    private static String METHOD_NAME1 = "getAllDealsbyCategorySer";
    private static String URL = "http://dosha.dotnetgeekz.com/ServerServices.asmx?WSDL";
    static final String KEY_DEAL = "deals"; // parent node
    static final String KEY_ID = "id";
    static final String KEY_HEADLINE = "DealHeadline";
    static final String KEY_CATEGORY = "DealCategory";
    static final String KEY_PRICE = "BuyPrice";
    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
    Button btnFar, btnCel, btnClear;
    EditText txtFar, txtCel;
    TextView textView2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mains);

        btnFar = (Button) findViewById(R.id.btnFar);
        txtFar = (EditText) findViewById(R.id.txtFar);
        textView2 = (TextView) findViewById(R.id.textView2);
        btnFar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // Initialize soap request + add parameters
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);
                // Use this to add parameters
                request.addProperty("category", txtFar.getText().toString());
                // Declare the version of the SOAP request
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.setOutputSoapObject(request);
                envelope.dotNet = true;
                try {
                    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                    // this is the actual part that will call the webservice
                    androidHttpTransport.call(SOAP_ACTION1, envelope);
                    // Get the SoapResult from the envelope body.
                    SoapObject result = (SoapObject) envelope.bodyIn;

                    if (result != null)
                    {
                        // Get the first property and change the label text                 
                        textView2.setText(result.getProperty(0).toString());
                    }
                    else
                    {
                        Toast.makeText(getApplicationContext(), "No Response",Toast.LENGTH_LONG).show();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

The error is:

08-31 11:36:06.606: E/dalvikvm-heap(334): Out of memory on a 2813318-byte allocation.
08-31 11:36:06.660: E/AndroidRuntime(334): FATAL EXCEPTION: main
08-31 11:36:06.660: E/AndroidRuntime(334): java.lang.OutOfMemoryError
08-31 11:36:06.660: E/AndroidRuntime(334):  at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
08-31 11:36:06.660: E/AndroidRuntime(334):  at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:153)
08-31 11:36:06.660: E/AndroidRuntime(334):  at java.lang.StringBuffer.append(StringBuffer.java:219)
08-31 11:36:06.660: E/AndroidRuntime(334):  at org.ksoap2.serialization.SoapObject.toString(SoapObject.java:646)
08-31 11:36:06.660: E/AndroidRuntime(334):  at com.android.webservicesdemo.androidactivity$1.onClick(androidactivity.java:84)
08-31 11:36:06.660: E/AndroidRuntime(334):  at android.view.View.performClick(View.java:2485)
08-31 11:36:06.660: E/AndroidRuntime(334):  at android.view.View$PerformClick.run(View.java:9080)
08-31 11:36:06.660: E/AndroidRuntime(334):  at android.os.Handler.handleCallback(Handler.java:587)
08-31 11:36:06.660: E/AndroidRuntime(334):  at android.os.Handler.dispatchMessage(Handler.java:92)
08-31 11:36:06.660: E/AndroidRuntime(334):  at android.os.Looper.loop(Looper.java:123)
08-31 11:36:06.660: E/AndroidRuntime(334):  at android.app.ActivityThread.main(ActivityThread.java:3683)
08-31 11:36:06.660: E/AndroidRuntime(334):  at java.lang.reflect.Method.invokeNative(Native Method)
08-31 11:36:06.660: E/AndroidRuntime(334):  at java.lang.reflect.Method.invoke(Method.java:507)
08-31 11:36:06.660: E/AndroidRuntime(334):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-31 11:36:06.660: E/AndroidRuntime(334):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-31 11:36:06.660: E/AndroidRuntime(334):  at dalvik.system.NativeStart.main(Native Method)
like image 888
user1516660 Avatar asked Aug 31 '12 06:08

user1516660


People also ask

Which of these could potentially throw an OutOfMemory error in Android?

Memory leaks cause the OutOfMemoryError in Android.

What is OutOfMemory error in Java?

OutOfMemoryError exception. Usually, this error is thrown when there is insufficient space to allocate an object in the Java heap. In this case, The garbage collector cannot make space available to accommodate a new object, and the heap cannot be expanded further.

How do you deal with Java Lang OutOfMemoryError?

Easy way to solve OutOfMemoryError in java is to increase the maximum heap size by using JVM options -Xmx512M , this will immediately solve your OutOfMemoryError.


1 Answers

Is it possible that your SOAP response is too big?

08-31 11:36:06.660: E/AndroidRuntime(334):  at org.ksoap2.serialization.SoapObject.toString(SoapObject.java:646)
08-31 11:36:06.660: E/AndroidRuntime(334):  at com.android.webservicesdemo.androidactivity$1.onClick(androidactivity.java:84)

Probably caused by line below

textView2.setText(result.getProperty(0).toString());

Top line also mentiones that String's length is possibly 2813318.

08-31 11:36:06.606: E/dalvikvm-heap(334): Out of memory on a 2813318-byte allocation.
like image 89
auselen Avatar answered Oct 05 '22 22:10

auselen