背景
其实从我本人来讲,我是抵制这个东西的webservice+ksoap请求效率低,不稳定,各种缺点。但是呢,公司还有一些老的项目在维护,为节约点时间,封装了一个简单的多线程改异步回调框架。
第一个版本没有用单例和建造者模式,随便写了一下,有时间再优化。
先看效果吧
WebserviceUtil w=new WebserviceUtil();//实例化webservice+ksoap工具类
w.setMethodName("GetNodeAttributeListById");//设置webservice请求方法
w.setUrl("http://........");
w.addParams("id","1");//添加请求的kv
w.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机制等,下期再说。