之前主要做客户端UI交互,很少处理数据和接触服务端,但现在的移动设备根本不可能离得开网络连接,数据的交换。最近学习的是在android端如何去调用远程WebService,都说WebService是一种基于SOAP协议的远程调用标准,对于这个协议理解不深,知道webservice可以将不同操作系统平台、不同语言、不同技术整合到一块,android SDK没有直接调用webservice的库,最常用的是借助ksoap2-android这个第三方SDK,点击打开链接,然后和其他第三方jar包一样导入android项目中即可。

对于WebService服务器具体的编写,现阶段自己不了解,暂且使用网络免费的WebService进行学习http://www.webxml.com.cn/zh_cn/index.aspx,利用这个来写一个简单的国内天气预报的查询,代码编写参照《疯狂Android讲义》相关部分,自己做部分修改。

-------------------------------------------------------------------------------------------------------------

以下是几个主要的方法:

1.创建HttpTransportSE传输对象:HttpTransportSE ht = new HttpTransportSE(SERVICE_URL); SERVICE_URL是webservice提供服务的url

2.使用SOAP1.1协议创建Envelop对象:SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 设置SOAP协议的版本号,根据服务端WebService的版本号设置。

3.实例化SoapObject对象:SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE, methodName); 第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第二个参数表示要调用的WebService方法名。

4.设置调用方法的参数值,如果没有参数,可以省略:例如soapObject.addProperty("theCityCode", cityName);

5.记得设置bodyout属性 envelope.bodyOut = soapObject;

6.调用webservice:ht.call(SERVICE_NAMESPACE+methodName, envelope);

7.获取服务器响应返回的SOAP消息:

SoapObject result = (SoapObject) envelope.bodyIn;
     SoapObject detail = (SoapObject) result.getProperty(methodName+"Result");

-------------------------------------------------------------------------------------------------------------

在这个天气预报的demo中需要多次调用webservice,将方法写在一个工具类中,代码如下:

  1. package com.example.webservicedemo;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import org.ksoap2.SoapEnvelope;
  7. import org.ksoap2.SoapFault;
  8. import org.ksoap2.serialization.SoapObject;
  9. import org.ksoap2.serialization.SoapSerializationEnvelope;
  10. import org.ksoap2.transport.HttpTransportSE;
  11. import org.xmlpull.v1.XmlPullParserException;
  12.  
  13. public class WebServiceUtil {
  14. // 定义webservice的命名空间
  15. public static final String SERVICE_NAMESPACE = "http://WebXml.com.cn/";
  16. // 定义webservice提供服务的url
  17. public static final String SERVICE_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
  18.  
  19. // 调用远程webservice获取省份列表
  20. public static List<String> getProvinceList() {
  21. // 调用 的方法
  22. String methodName = "getRegionProvince";
  23. // 创建HttpTransportSE传输对象
  24. HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
  25. try {
  26. ht.debug = true;
  27. // 使用SOAP1.1协议创建Envelop对象
  28. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
  29. SoapEnvelope.VER11);
  30. // 实例化SoapObject对象
  31. SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE,
  32. methodName);
  33. envelope.bodyOut = soapObject;
  34. // 设置与.NET提供的webservice保持较好的兼容性
  35. envelope.dotNet = true;
  36.  
  37. // 调用webservice
  38. ht.call(SERVICE_NAMESPACE + methodName, envelope);
  39. if (envelope.getResponse() != null) {
  40. // 获取服务器响应返回的SOAP消息
  41. SoapObject result = (SoapObject) envelope.bodyIn;
  42. SoapObject detail = (SoapObject) result.getProperty(methodName
  43. + "Result");
  44. // 解析服务器响应的SOAP消息
  45. return parseProvinceOrCity(detail);
  46. }
  47. } catch (SoapFault e) {
  48. // TODO Auto-generated catch block
  49. e.printStackTrace();
  50. } catch (IOException e) {
  51. // TODO Auto-generated catch block
  52. e.printStackTrace();
  53. } catch (XmlPullParserException e) {
  54. // TODO Auto-generated catch block
  55. e.printStackTrace();
  56. }
  57. return null;
  58. }
  59.  
  60. // 根据省份获取城市列表
  61. public static List<String> getCityListsByProvince(String province) {
  62. // 调用的方法
  63. String methodName = "getSupportCityString";
  64. // 创建httptransportSE传输对象
  65. HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
  66. ht.debug = true;
  67. // 实例化SoapObject对象
  68. SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE, methodName);
  69. // 添加一个请求参数
  70. soapObject.addProperty("theRegionCode", province);
  71. // 使用soap1.1协议创建envelop对象
  72. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
  73. SoapEnvelope.VER11);
  74. envelope.bodyOut = soapObject;
  75. // 设置与.NET提供的webservice保持较好的兼容性
  76. envelope.dotNet = true;
  77.  
  78. // 调用webservice
  79. try {
  80. ht.call(SERVICE_NAMESPACE + methodName, envelope);
  81. if (envelope.getResponse() != null) {
  82. // 获取服务器响应返回的SOAP消息
  83. SoapObject result = (SoapObject) envelope.bodyIn;
  84. SoapObject detail = (SoapObject) result.getProperty(methodName
  85. + "Result");
  86. // 解析服务器响应的SOAP消息
  87. return parseProvinceOrCity(detail);
  88. }
  89. } catch (SoapFault e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. } catch (IOException e) {
  93. // TODO Auto-generated catch block
  94. e.printStackTrace();
  95. } catch (XmlPullParserException e) {
  96. // TODO Auto-generated catch block
  97. e.printStackTrace();
  98. }
  99. return null;
  100. }
  101.  
  102. // 解析省份或城市
  103. public static List<String> parseProvinceOrCity(SoapObject detail) {
  104. ArrayList<String> result = new ArrayList<String>();
  105. for (int i = 0; i < detail.getPropertyCount(); i++) {
  106. // 解析出每个省份
  107. result.add(detail.getProperty(i).toString().split(",")[0]);
  108. }
  109. return result;
  110. }
  111.  
  112. // 根据城市字符串获取相应天气情况
  113. public static SoapObject getWeatherByCity(String cityName) {
  114. String methodName = "getWeather";
  115. HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
  116. ht.debug = true;
  117. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
  118. SoapEnvelope.VER11);
  119. SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE, methodName);
  120. soapObject.addProperty("theCityCode", cityName);
  121. envelope.bodyOut = soapObject;
  122. envelope.dotNet = true;
  123.  
  124. try {
  125. ht.call(SERVICE_NAMESPACE + methodName, envelope);
  126. SoapObject result = (SoapObject) envelope.bodyIn;
  127. SoapObject detail = (SoapObject) result.getProperty(methodName
  128. + "Result");
  129. return detail;
  130. } catch (IOException e) {
  131. // TODO Auto-generated catch block
  132. e.printStackTrace();
  133. } catch (XmlPullParserException e) {
  134. // TODO Auto-generated catch block
  135. e.printStackTrace();
  136. }
  137. return null;
  138. }
  139.  
  140. }

上面这个便是主要实现远程调用webservice的代码,其他实现在activity中完成即可,但是这里也会涉及到一个问题,就是Android多线程问题,在调用webservice时,为了防止ANR的出现,不能在主线程中进行,需要另开子线程执行,,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的.便要涉及Handler的使用了,实在是不才,自己更多时候习惯使用AsyncTask来代替Handler(还是要重新琢磨下Handler的使用方法),因为操作起来比较简单方便,下面是项目中异步操作类中的一个:

  1. package com.example.webservicedemo;
  2.  
  3. import java.util.List;
  4. import android.os.AsyncTask;
  5. import android.widget.Spinner;
  6.  
  7. public class ProvinceAsyncTask extends AsyncTask<String, String, List<String>> {
  8. private MainActivity activity;
  9. private List<String> provinces;
  10. private Spinner sp_province;
  11.  
  12. public ProvinceAsyncTask (MainActivity activity,Spinner sp_province){
  13. this.activity = activity;
  14. this.sp_province = sp_province;
  15. }
  16.  
  17. @Override
  18. protected List<String> doInBackground(String... params) {
  19. // TODO Auto-generated method stub
  20. provinces = WebServiceUtil.getProvinceList();
  21. return null;
  22. }
  23.  
  24. @Override
  25. protected void onPostExecute(List<String> result) {
  26. // TODO Auto-generated method stub
  27. ListAdapter adapter = new ListAdapter(activity, provinces);
  28. sp_province.setAdapter(adapter);
  29.  
  30. }
  31. }

可以看出来比较简单,在doInBackground中执行调用webservice,在onPostExecute中执行列表刷新展示

最后附上该demo的代码,希望可以对初涉及android调用webservice的朋友有帮助

http://download.csdn.net/detail/eyu8874521/5609627

Android使用ksoap2-android调用WebService学习的更多相关文章

  1. Android开发系列之调用WebService

    我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到 ...

  2. 调用webService学习小结

    这段时间项目进行到了最后时刻,但是还有很多需求没有搞清楚,眼看deadline越来越近,压力也越来越大.现在我的主要工作是将别人开发好的一个系统给加载到我们系统中,使用的方法是通过webService ...

  3. 在Android 中使用KSOAP2调用WebService

    WebService 是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.在Android SDK中并没有提供调用WebService的 ...

  4. 网摘Android调用WebService

    这边特别注意调用的.net WCF 接口的绑定方式.以前一直用的wxHttpbinding,一直连不上.改成BasicHTTPbinding就能连上了 上篇文章已经对Web Service及其相关知识 ...

  5. Android使用ksoap2调用C#中的webservice实现图像上传

    目录: 一. android使用ksoap2调用webservice 二. 异步调用 三. Android使用ksoap2调用C#中的webservice实现图像上传参考方法 四. 图像传输中Base ...

  6. Android通过ksoap2这个框架调用webservice大讲堂

    昨天有人问我Android怎么连接mysql数据库,和对数据库的操作呀,我想把,给他说说json通信,可是他并不知道怎么弄,哎算了吧,直接叫他用ksoap吧,给他说了大半天,好多零碎的知识,看来还是有 ...

  7. Android使用KSOAP2调用WebService及正确导入jar包的问题(转)

    Android使用KSOAP2调用WebService及正确导入jar包的问题(转)     错误信息 最近在学Android使用KSOAP2调用现有的Webservice的方法,期间在网上找了很多代 ...

  8. 【转载】Android通过ksoap2调用.net(c#)的webservice

    转载自:http://www.cnblogs.com/badtree/articles/3242842.html ■下载 ksoap2-android 包 去http://code.google.co ...

  9. 在Android中使用Android Ksoap2调用WebService

    一.WebService介绍 WebService是基于SOAP协议可实现web服务器与web服务器之间的通信,因采用SOAP协议传送XML数据具有平台无关性,也是成为解决异构平台之间通信的重要解决方 ...

随机推荐

  1. ubuntu 安装python,easy_install和pip

    ubuntu12.04默认安装的python为 ms@ubuntums:~$ pythonPython 2.7.3 (default, Aug 1 2012, 05:16:07) 我需要用python ...

  2. poj2947

    高斯消元法模版题,但套模版没用.. 先回顾一下线性代数的知识. 若要求解如下方程: 首先,其系数矩阵为 然后,其增广矩阵为: 然后若要求解这个方程,首先将第一行第一个元素化为1,即:第一行乘以1/3. ...

  3. hdu-4302-Holedox Eating-线段树-单点更新,有策略的单点查询

    一開始实在是不知道怎么做,后来经过指导,猛然发现,仅仅须要记录某个区间内是否有值就可以. flag[i]:代表i区间内,共同拥有的蛋糕数量. 放置蛋糕的时候非常好操作,单点更新. ip:老鼠当前的位置 ...

  4. 利用httpclient和多线程刷訪问量代码

    缘起于玩唱吧,由于唱吧好友少,訪问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的訪问机制,准备用java的httpclient库来进行刷訪问量,想到动态IP反复使用就想到了用多线程 ...

  5. TROUBLE SHOOTING: FRM-30425

    关键字:Oracle Form buider FRM-30425 汇总 错误信息如下: FRM-30425: Summarized database item must reside in a blo ...

  6. eclipse No Default Proposals 无提示

    链接地址:http://blog.csdn.net/rogerjava/article/details/5689785 今天特抑郁,早上开机后发现eclipse的代码提示功能不好使了,Alt+/ 这么 ...

  7. perl 面向对象 new方法

    [root@wx03 test]# cat Scan.pm package Scan; sub new{ my $class = shift; my $self={ 'a'=>11, 'b'=& ...

  8. javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景

    在今天之前我一直以为setTimeout这个函数是异步的,无意中看到了一篇关于setTimeout的文章.发现自己曾经的认识全是错误的,赶紧总结下. 先看一段代码: var start = new D ...

  9. 路径中“/” "\" "\\"的区别

    Unix使用斜杆/ 作为路径分隔符,而web应用最新使用在Unix系统上面,所以目前所有的网络地址都采用 斜杆/ 作为分隔符. Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不 ...

  10. c语言,内存字节对齐

    引用:内存字节对齐 写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧. /************* ...