time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > Android使用工具类轻松实现通过WebService进行网络编程

Android使用工具类轻松实现通过WebService进行网络编程

时间:2014-01-22 17:19 点击:5653次 字体:[ ]




相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人很喜欢服务器给我们返回JSON数据格式,因为他解析方便,也有一些JSON的解析库,例如Google提供的GSON,阿里巴巴的FastJson,不过还是推荐大家使用FastJson来解析,我自己开发中也是用FastJson来解析,FastJson的介绍http://code.alibabatech.com/wiki/display/FastJSON/Home ,不过有时候我们用到WebService接口来获取数据, WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台、不同语言、不同技术整合到一块。在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Android系统中。因此,这些开发包并不是在我们的考虑范围内。适合手机的WebService客户端的SDK有一些,比较常用的有Ksoap2,可以从http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 进行下载,将jar包加入到libs目录下就行了,接下来带大家来调用WebService接口

首先我们新建一个工程,取名WebServiceDemo,我们从http://www.webxml.com.cn/zh_cn/web_services.aspx 来获取WebService接口,这里面有一些免费的WebService接口,我们就用里面的天气接口吧http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

我们新建一个WebService的工具类,用于对WebService接口的调用,以后遇到调用WebService直接拷贝来用就行了

  1. package com.example.webservicedemo;  
  2.  
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. import java.util.Iterator;  
  6. import java.util.Map;  
  7. import java.util.concurrent.ExecutorService;  
  8. import java.util.concurrent.Executors;  
  9.  
  10. import org.ksoap2.SoapEnvelope;  
  11. import org.ksoap2.serialization.SoapObject;  
  12. import org.ksoap2.serialization.SoapSerializationEnvelope;  
  13. import org.ksoap2.transport.HttpResponseException;  
  14. import org.ksoap2.transport.HttpTransportSE;  
  15. import org.xmlpull.v1.XmlPullParserException;  
  16.  
  17. import android.os.Handler;  
  18. import android.os.Message;  
  19.  
  20. /**  
  21.  * 访问WebService的工具类,  
  22.  *     
  23.  *   
  24.  * @author xiaanming  
  25.  *   
  26.  */ 
  27. public class WebServiceUtils {  
  28.     public static final String WEB_SERVER_URL = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";  
  29.       
  30.       
  31.     // 含有3个线程的线程池  
  32.     private static final ExecutorService executorService = Executors  
  33.             .newFixedThreadPool(3);  
  34.  
  35.     // 命名空间  
  36.     private static final String NAMESPACE = "http://WebXml.com.cn/";  
  37.  
  38.     /**  
  39.      *   
  40.      * @param url  
  41.      *            WebService服务器地址  
  42.      * @param methodName  
  43.      *            WebService的调用方法名  
  44.      * @param properties  
  45.      *            WebService的参数  
  46.      * @param webServiceCallBack  
  47.      *            回调接口  
  48.      */ 
  49.     public static void callWebService(String url, final String methodName,  
  50.             HashMap<String, String> properties,  
  51.             final WebServiceCallBack webServiceCallBack) {  
  52.         // 创建HttpTransportSE对象,传递WebService服务器地址  
  53.         final HttpTransportSE httpTransportSE = new HttpTransportSE(url);  
  54.         // 创建SoapObject对象  
  55.         SoapObject soapObject = new SoapObject(NAMESPACE, methodName);  
  56.  
  57.         // SoapObject添加参数  
  58.         if (properties != null) {  
  59.             for (Iterator<Map.Entry<String, String>> it = properties.entrySet()  
  60.                     .iterator(); it.hasNext();) {  
  61.                 Map.Entry<String, String> entry = it.next();  
  62.                 soapObject.addProperty(entry.getKey(), entry.getValue());  
  63.             }  
  64.         }  
  65.  
  66.         // 实例化SoapSerializationEnvelope,传入WebService的SOAP协议的版本号  
  67.         final SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(  
  68.                 SoapEnvelope.VER11);  
  69.         // 设置是否调用的是.Net开发的WebService  
  70.         soapEnvelope.setOutputSoapObject(soapObject);  
  71.         soapEnvelope.dotNet = true;  
  72.         httpTransportSE.debug = true;  
  73.  
  74.         // 用于子线程与主线程通信的Handler  
  75.         final Handler mHandler = new Handler() {  
  76.  
  77.             @Override 
  78.             public void handleMessage(Message msg) {  
  79.                 super.handleMessage(msg);  
  80.                 // 将返回值回调到callBack的参数中  
  81.                 webServiceCallBack.callBack((SoapObject) msg.obj);  
  82.             }  
  83.  
  84.         };  
  85.  
  86.         // 开启线程去访问WebService  
  87.         executorService.submit(new Runnable() {  
  88.  
  89.             @Override 
  90.             public void run() {  
  91.                 SoapObject resultSoapObject = null;  
  92.                 try {  
  93.                     httpTransportSE.call(NAMESPACE + methodName, soapEnvelope);  
  94.                     if (soapEnvelope.getResponse() != null) {  
  95.                         // 获取服务器响应返回的SoapObject  
  96.                         resultSoapObject = (SoapObject) soapEnvelope.bodyIn;  
  97.                     }  
  98.                 } catch (HttpResponseException e) {  
  99.                     e.printStackTrace();  
  100.                 } catch (IOException e) {  
  101.                     e.printStackTrace();  
  102.                 } catch (XmlPullParserException e) {  
  103.                     e.printStackTrace();  
  104.                 } finally {  
  105.                     // 将获取的消息利用Handler发送到主线程  
  106.                     mHandler.sendMessage(mHandler.obtainMessage(0,  
  107.                             resultSoapObject));  
  108.                 }  
  109.             }  
  110.         });  
  111.     }  
  112.  
  113.     /**  
  114.      *   
  115.      *   
  116.      * @author xiaanming  
  117.      *   
  118.      */ 
  119.     public interface WebServiceCallBack {  
  120.         public void callBack(SoapObject result);  
  121.     }  
  122.  

我们通过调用里面的callWebService(String url, final String methodName,HashMap<String, String> properties,final WebServiceCallBack webServiceCallBack)就可以来获取我们想要的数据,现在讲解下里面的实现思路

 

  • 创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URL
  • 创建SoapObject对象,里面的参数分别是WebService的命名空间和调用方法名
  • 设置调用方法的参数值,如果没有参数,就不设置,有参数的话调用SoapObject对象的addProperty(String name, Object value)方法将参数加入到SoapObject对象中
  • 实例化SoapSerializationEnvelope,传入WebService的SOAP协议的版本号,将上面的SoapObject对象通过setOutputSoapObject(Object soapObject)设置到里面,并设置是否调用的是.Net开发的WebService和是否debug等信息
  • 因为涉及到网络操作,所以我们使用了线程池来异步操作调用WebService接口,我们在线程中调用HttpTransportsSE对象的call(String soapAction, SoapEnvelope envelope)方法就能实现对WebService的调用,并且通过soapEnvelope.bodyIn获取WebService返回的信息,但是返回的信息是在子线程中,我们需要利用Handler来实现子线程与主线程进行转换,然后在Handler的handleMessage(Message msg)中将结果回调到callBack的参数中,总体思路就是这个样子,接下来我们来使用这个工具类吧



本文地址 : http://www.fengfly.com/plus/view-214539-1.html
标签: Android webservice
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: