android中webservice请求的异步回调封装(一)

来源:互联网 发布:淘宝一千零一夜 编辑:程序博客网 时间:2024/06/07 21:53

背景

其实从我本人来讲,我是抵制这个东西的webservice+ksoap请求效率低,不稳定,各种缺点。但是呢,公司还有一些老的项目在维护,为节约点时间,封装了一个简单的多线程改异步回调框架。

第一个版本没有用单例和建造者模式,随便写了一下,有时间再优化。

先看效果吧

WebserviceUtil w=new WebserviceUtil();//实例化webservice+ksoap工具类w.setMethodName("GetNodeAttributeListById");//设置webservice请求方法w.setUrl("http://........");w.addParams("id","1");//添加请求的kvw.addParams("sid", "3");w.setCallBack(new Wcallback() {//设置回调    @Override    public void success(String s) {        //成功时回调,UI线程。        Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();    }    @Override    public void failed(String s) {        //失败时回调    }});w.exec();//请求

这样一个简单的请求方法就出来了,下面分析如何实现

写回调接口

public interface  Wcallback {    void success(String s);//成功回调    void failed(String s);//失败时回调}

写工具类

public class WebserviceUtil {private Wcallback callBack;private String methodName,endPoint;private Map<String, String> request = new HashMap<String, String>();public void setMethodName(String methodName) {    this.methodName = methodName;}public void setUrl(String endPoint) {    this.endPoint= endPoint;}public void addParams(String id, String s) {    request.put(id, s);}public void setCallBack(Wcallback callBack) {    this.callBack = callBack;}public void exec() {    new Thread(new Runnable() {        @Override        public void run() {            String nameSpace = "*******";            String soapAction = nameSpace + methodName;            SoapObject soapObject = new SoapObject(nameSpace, methodName);            for (String key : request.keySet()) {                soapObject.addProperty(key, request.get(key));            }            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);            envelope.bodyOut = soapObject;            envelope.dotNet = true;            envelope.setOutputSoapObject(soapObject);            HttpTransportSE transport = new HttpTransportSE(endPoint, 3000);            try {                transport.call(soapAction, envelope);            } catch (IOException e) {                e.printStackTrace();            } catch (XmlPullParserException e) {                e.printStackTrace();            }            Message message = mHandler.obtainMessage();            message.what = 1;            String result = null;            try {                SoapObject object = (SoapObject) envelope.bodyIn;                result = object.getProperty(0).toString();            } catch (Exception e1) {                message.what = 2;//失败时                e1.printStackTrace();            }            message.obj = result;            mHandler.sendMessage(message);        }    }).start();}private Handler mHandler = new Handler() {    public void handleMessage(android.os.Message msg) {        switch (msg.what) {            case 1:                callBack.success(msg.obj.toString());                break;            case 2:                callBack.failed(msg.obj.toString());                break;            default:                break;        }    }};}

ok,搞定,一个简单的webservice请求框架就写好了,不用每个activity都写一个handle,一个请求了。

当然还有一些优化,比如单例、建造者模式、task机制等,下期再说。

0 0
原创粉丝点击