Android开发之WebService篇

来源:互联网 发布:amtemu mac使用方法 编辑:程序博客网 时间:2024/05/16 09:59
   昨天有同学在网上问我,Android怎样调用WebService接口。我还是两年前调用的WebService接口,   现在把原先的代码翻出来,截图给他看了,现在也总结下吧。

1.使用jar:ksoap2
下载地址网上多的是,自己百度下载个,as easy as ABC!

2.封装个Util类吧

public class WebServiceUtils {    public static final String WEB_SERVER_URL = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";    // 含有3个线程的线程池    private static final ExecutorService executorService = Executors            .newFixedThreadPool(3);    // 命名空间    private static final String NAMESPACE = "http://WebXml.com.cn/";    /**     *      * @param url     *            WebService服务器地址     * @param methodName     *            WebService的调用方法名     * @param properties     *            WebService的参数     * @param webServiceCallBack     *            回调接口     */    public static void callWebService(String url, final String methodName,            HashMap<String, String> properties,            final WebServiceCallBack webServiceCallBack) {        // 创建HttpTransportSE对象,传递WebService服务器地址        final HttpTransportSE httpTransportSE = new HttpTransportSE(url);        // 创建SoapObject对象        SoapObject soapObject = new SoapObject(NAMESPACE, methodName);        // SoapObject添加参数        if (properties != null) {            for (Iterator<Map.Entry<String, String>> it = properties.entrySet()                    .iterator(); it.hasNext();) {                Map.Entry<String, String> entry = it.next();                soapObject.addProperty(entry.getKey(), entry.getValue());            }        }        // 实例化SoapSerializationEnvelope,传入WebService的SOAP协议的版本号        final SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(                SoapEnvelope.VER11);        // 设置是否调用的是.Net开发的WebService        soapEnvelope.setOutputSoapObject(soapObject);        soapEnvelope.dotNet = true;        httpTransportSE.debug = true;        // 用于子线程与主线程通信的Handler        final Handler mHandler = new Handler() {            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                // 将返回值回调到callBack的参数中                webServiceCallBack.callBack((SoapObject) msg.obj);            }        };        // 开启线程去访问WebService        executorService.submit(new Runnable() {            @Override            public void run() {                SoapObject resultSoapObject = null;                try {                    httpTransportSE.call(NAMESPACE + methodName, soapEnvelope);                    if (soapEnvelope.getResponse() != null) {                        // 获取服务器响应返回的SoapObject                        resultSoapObject = (SoapObject) soapEnvelope.bodyIn;                    }                } catch (HttpResponseException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                } catch (XmlPullParserException e) {                    e.printStackTrace();                } finally {                    // 将获取的消息利用Handler发送到主线程                    mHandler.sendMessage(mHandler.obtainMessage(0,                            resultSoapObject));                }            }        });    }    public interface WebServiceCallBack {        public void callBack(SoapObject result);    }}

说明:

  • 搞个线程池去请求数据
 executorService.submit
  • 获取数据后通过Handler 调度
mHandler.sendMessage(mHandler.obtainMessage(0,resultSoapObject));
  • 搞个接口回调
webServiceCallBack.callBack((SoapObject) msg.obj);

2.使用

//通过工具类调用WebService接口        WebServiceUtils.callWebService(WebServiceUtils.WEB_SERVER_URL, "getSupportProvince", null, new WebServiceCallBack() {            //WebService接口返回的数据回调到这个方法中            @Override            public void callBack(SoapObject result) {                //关闭进度条                ProgressDialogUtils.dismissProgressDialog();                if(result != null){                    SoapObject provinceSoapObject = (SoapObject) result.getProperty("getSupportProvinceResult");                    String Str= provinceSoapObject.toString() ;                }else{                    Toast.makeText(MainActivity.this, "获取WebService数据错误", Toast.LENGTH_SHORT).show();                }            }        });

使用方法很简单,没有必要解释什么。可以稍微扩展下:

  • 请求前后可以加个进度条,提示数据正在请求中
  • 这个回调方法的话,可以加个状态码,在请求错误的时候可以通过返回的状态码去友好处理
  • 这个WebService请求的话,底层是可以使用okhttp的,网络请求更快捷
  • 这个线程池的话,这里固定写的是3个线程。大家可以根据手机的实际配置去动态申请线程数量,不过一般情况下这样写也够用了
  • 这个Handler 也改成弱引用吧
  • 真的没有什么好写的了,就写到这里吧
1 0
原创粉丝点击