Android
web service access using Async Task
In Android we can use Async Tasks to
perform background activities without interrupting main gui thread. So it is
ideal for the tasks like web service accessing in Android. In this post I'm
going to demonstrate a very simple application which uses Async Task to access
soap based web service. Here I access .NET web service Currency Converter provided by http://www.webservicex.net/.
To create this application you need to have ksoap2 libaray. (You can download latest version of ksoap2 from here : http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 click the url under "with a direct download url of ").
Here is the quick demo of the application.
To create this application you need to have ksoap2 libaray. (You can download latest version of ksoap2 from here : http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 click the url under "with a direct download url of ").
Here is the quick demo of the application.
Code for the main activity:
In line 68 I have set "envelope.dotNet = true;" because I'm accessing .NET web service. You can comment that line if you are accessing other web service.
|
package com.soap.client;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity
extends Activity {
private TextView
textView;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView
= (TextView) findViewById(R.id.textView1);
this.accessWebService(textView);
}
@Override
public boolean onCreateOptionsMenu(Menu
menu) {
//
Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main,
menu);
return true;
}
//starting
asynchronus task
private class SoapAccessTask
extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute()
{
//if
you want, start progress dialog here
}
@Override
protected String
doInBackground(String... urls) {
String
webResponse = "";
try{
final String
METHOD_NAME = "ConversionRate";
SoapObject
request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo
fromProp =new PropertyInfo();
fromProp.setName("FromCurrency");
//gets
the first element from urls array
fromProp.setValue(urls[0]);
fromProp.setType(String.class);
request.addProperty(fromProp);
PropertyInfo
toProp =new PropertyInfo();
toProp.setName("ToCurrency");
//second
element of the urls array
toProp.setValue(urls[1]);
toProp.setType(String.class);
request.addProperty(toProp);
SoapSerializationEnvelope
envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet
= true;
envelope.setOutputSoapObject(request);
HttpTransportSE
androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION,
envelope);
SoapPrimitive
response = (SoapPrimitive)envelope.getResponse();
webResponse
= response.toString();
}
catch(Exception
e){
Toast.makeText(getApplicationContext(),"Cannot
access the web service"+e.toString(), Toast.LENGTH_LONG).show();
}
return webResponse;
}
@Override
protected void onPostExecute(String
result) {
//if
you started progress dialog dismiss it here
textView.setText(result);
Toast.makeText(getApplicationContext(),"Completed...",
Toast.LENGTH_LONG).show();
}
}
public void accessWebService(View
view) {
SoapAccessTask
task = new SoapAccessTask();
//passes
values for the urls string array
task.execute(new String[]
{ "USD","LKR"});
}
}
|
Code for the layout
|
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="89dp"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
|
You have to add INTERNET permission to AndroidManifest.xml
|
<?xml version="1.0" encoding="utf-8"?>
package="com.soap.client"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.soap.client.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
|
Comments
Post a Comment