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)
Memory leaks cause the OutOfMemoryError in Android.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With