Android WebService
一、WebService
         按某种数据规范发布的一种服务形式,为应用程序提供相应数据。
 
         如这个天气预报Web服务:
 
二、简单样例

         搜索Android WebService就可以找到很多了==,就简单讲讲了。

         1)一样使用的是KSOAP第三方类库
 
  
  1. /** 
  2.  * 访问WebService 
  3.  * 
  4.  * @param methodName 
  5.  *            WebService方法名 
  6.  * @param propertyInfo 
  7.  *            WebService方法参数 
  8.  * @return SoapObject 返回结果 
  9.  */ 
  10. private SoapObject visitWebService(String methodName, 
  11.        PropertyInfo propertyInfo) throws Exception { 
  12.  
  13.    if (null != onWebServiceListener) { 
  14.        onWebServiceListener.onStart(); 
  15.    } 
  16.  
  17.    // 第1步:创建SoapObject对象,并指定WebService的命名空间和调用的方法名 
  18.    SoapObject request = new SoapObject(Code.SERVICE_NAMESPACE, methodName); 
  19.    // 第2步:设置WebService方法的参数 
  20.    if (null != propertyInfo) { 
  21.        request.addProperty(propertyInfo); 
  22.    } 
  23.    // 第3步:创建SoapSerializationEnvelope对象,并指定WebService版本 
  24.    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( 
  25.  
  26.           SoapEnvelope.VER11); 
  27.    // 设置bodyOut属性 
  28.    envelope.bodyOut = request; 
  29.    // 需要设置dotNet属性,否则报错 
  30.    envelope.dotNet = true
  31.    envelope.setOutputSoapObject(request); 
  32.    envelope.encodingStyle = "UTF-8"
  33.    // 第4步:创建HttpTransportSE对象并指定WSDL文档的URL 
  34.    HttpTransportSE ht = new HttpTransportSE(Code.SERVICE_URL); 
  35.    try { 
  36.        // 第5步:调用WebService 
  37.        // ht.call(null, envelope); 
  38.  
  39.        // 需要设置SOAPAction的值,否则报错 
  40.        ht.call(Code.SERVICE_NAMESPACE + methodName, envelope); 
  41.        // 第6步:使用getResponse方法获得WebService方法的返回结果 
  42.        SoapObject soapObject = (SoapObject) envelope.getResponse(); 
  43.  
  44.        // SoapObject soapObject = (SoapObject) envelope.bodyIn; 
  45.  
  46.        Log.v("返回结果""=" + soapObject); 
  47.  
  48.        return soapObject; 
  49.    } catch (Exception e) { 
  50.        e.printStackTrace(); 
  51.        Log.e("HttpTransportSE.call""调用WebService出错!"); 
  52.        if (null != onWebServiceListener) { 
  53.           onWebServiceListener.onError(); 
  54.        } 
  55.        throw e; 
  56.    } 
         在org.join.weather.util内的WebService把Web服务提供的所有接口都装在里面了。
记得当时主要有个怎么从多行多列的返回结果中的获得信息的问题。开始用正则,后来直接下网页进行XML解析,提高了很多效率。
 
         2)界面划成了三块,用的别人的画廊组件(加了点东西,中文注释的就是我加的了==)
         组件见包org.join.weather.widget下的FlingGallery。包内另一个MySpinner则是扩展的组件,用于省份和城市的联动。
         顺便提下左右滑屏也可以用Android扩展的android-support-v4.jar内的ViewPager。
 
         3)其他问题
         1、网络刚开始只当是Wifi(怨念==),后来才修改成了连接状态,总之流程感觉怪怪的了。在org.join.weather.broadcast的WifiReceiver内还可以看到注释的旧代码。
         2、GPSUtil那块,如果未开启GPS时会跳转到设置,但你不开启回来再操作,会有个provider=null的异常未处理。另外,不确定能不能定到位了。还发现三个定位模式的代码都有写(没印象了,囧)。
 
         4)截个图,看看效果吧

city.png  city.png city.png

三、后记
         源码问题多多,还请各位大哥多多包涵了T^T。
 
         ps:如果想自己发布WebService自己访问什么的,我的《 Android基础样例》里有一个这方面的简单例子。