我们知道,Android应用通常是运行在手机平台上,手机系统的硬件资源是有限的,不管是存储能力还是计算能力都有限,在Android系统上开发,运行一些单用户,小型应用是可能的,但对于需要进行大量的数据处理,复杂计算的应用,还是只能部署在远程服务器上,Android应用将只是充当这些应用的客户端。
为了让Android应用与远程服务器之间进行交互,可以借助于Java的RMI技术,但这要求远程服务器必须采用Java实现;也要以采用CORBA技术,但这种技术显得于过复杂;除此之外,WebService是一种不错的选择。
关于WebServcie在网上有很多的介绍,在阿堂的技术博客上也有一些文章的介绍,这里我就不多说了,不懂的网友可去网上查阅资料。
下面,阿堂主要介绍Android应用调用WebService的步骤,并且后面附上一Demo的主要代码文件。
Google为Android平台开发WebService客户端提供了ksoap2-android项目,但这个项目并未直接集成在Android平台中,还需要开发人员下载。
下载地址: http://code.google.com/p/ksoap2-android/站点,该站点有介绍下载ksoap2-android项目的方法。下载过程,阿堂就不再说明了。
使用ksoap2-android调用webservice操作的步骤如下
(1)创建HttpTransportSE对象,该对象用于调用Webservice操作。
(2)创建SoapSerializationEnvelope对象。(使用SoapSerializationEnvelope对象的bodyOut属性传给服务器,服务器响应生成的SOAP消息也通过SoapSerializationEnvelope对象的bodyin属性来获取)
(3)创建SoapObject对象,创建该对象时需要传入所要调用WebService的命名空间。
(4)如果用参数需要传给WebServcie服务端,调用SoapObject对象的addProperty(String name,Objectvalue)方法来设置参数,该方法的name参数指定参数名;value参数指定参数值。
(5)调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为SoapSerializationEnvelpe的传出SOAP消息体。
(6)调用对象的call()方法,并以SoapSerializationEnvelpe作为参数调用远程WebServcie。
(7)调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个SoapObjectd对象,该对象就代表了WebService的返回消息。解析该SoapObject对象,即可获取调用Web Service的返回值。
下面,请随要阿堂看一个实例:调用WebService实现天气预报
在开发天气预报的Android应用之前,首先找到一个可以对外提供天气预报的WebService,通过搜索, 发现http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx站点,可以对外提供天气预报的WebService,因此程序将会调用该站点的Web
Service来实现天气预报。
请看阿堂操作时的截图效果
请看三个主要文件(请网友们针对下面的代码,好好体会使用ksoap2-android调用webservice操作的步骤)
public classWebServiceUtil
{
// 定义WebService的命名空间
static finalString SERVICE_NS = "http://WebXml.com.cn/";
// 定义WebService提供服务的URL
static finalString SERVICE_URL =
"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
// 调用远程WebService获取省份列表
publicstatic List getProvinceList()
{
//调用的方法
StringmethodName = "getRegionProvince";
//创建HttpTransportSE传输对象
HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
ht.debug =true;
//使用SOAP1.1协议创建Envelop对象
SoapSerializationEnvelope envelope = newSoapSerializationEnvelope(
SoapEnvelope.VER11);
//实例化SoapObject对象
SoapObjectsoapObject = new SoapObject(SERVICE_NS, methodName);
envelope.bodyOut = soapObject;
//设置与.Net提供的Web Service保持较好的兼容性
envelope.dotNet = true;
try
{
// 调用WebService
ht.call(SERVICE_NS + methodName, envelope);
if(envelope.getResponse() != null)
{
//获取服务器响应返回的SOAP消息
SoapObjectresult = (SoapObject) envelope.bodyIn;
SoapObjectdetail = (SoapObject) result.getProperty(methodName