Android WebService
一、WebService
按某种数据规范发布的一种服务形式,为应用程序提供相应数据。
如这个天气预报Web服务:
二、简单样例
搜索Android WebService就可以找到很多了==,就简单讲讲了。
1)一样使用的是KSOAP第三方类库
- /**
- * 访问WebService
- *
- * @param methodName
- * WebService方法名
- * @param propertyInfo
- * WebService方法参数
- * @return SoapObject 返回结果
- */
- private SoapObject visitWebService(String methodName,
- PropertyInfo propertyInfo) throws Exception {
- if (null != onWebServiceListener) {
- onWebServiceListener.onStart();
- }
- // 第1步:创建SoapObject对象,并指定WebService的命名空间和调用的方法名
- SoapObject request = new SoapObject(Code.SERVICE_NAMESPACE, methodName);
- // 第2步:设置WebService方法的参数
- if (null != propertyInfo) {
- request.addProperty(propertyInfo);
- }
- // 第3步:创建SoapSerializationEnvelope对象,并指定WebService版本
- SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- // 设置bodyOut属性
- envelope.bodyOut = request;
- // 需要设置dotNet属性,否则报错
- envelope.dotNet = true;
- envelope.setOutputSoapObject(request);
- envelope.encodingStyle = "UTF-8";
- // 第4步:创建HttpTransportSE对象并指定WSDL文档的URL
- HttpTransportSE ht = new HttpTransportSE(Code.SERVICE_URL);
- try {
- // 第5步:调用WebService
- // ht.call(null, envelope);
- // 需要设置SOAPAction的值,否则报错
- ht.call(Code.SERVICE_NAMESPACE + methodName, envelope);
- // 第6步:使用getResponse方法获得WebService方法的返回结果
- SoapObject soapObject = (SoapObject) envelope.getResponse();
- // SoapObject soapObject = (SoapObject) envelope.bodyIn;
- Log.v("返回结果", "=" + soapObject);
- return soapObject;
- } catch (Exception e) {
- e.printStackTrace();
- Log.e("HttpTransportSE.call", "调用WebService出错!");
- if (null != onWebServiceListener) {
- onWebServiceListener.onError();
- }
- throw e;
- }
- }
在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)截个图,看看效果吧
三、后记
源码问题多多,还请各位大哥多多包涵了T^T。
ps:如果想自己发布WebService自己访问什么的,我的《 》里有一个这方面的简单例子。