Android调用WebService系列之封装能力
上一篇,我们简单的讲述了Android如何进行WebService调用!
而往往我们在项目中会先封装一下再使用!那么我们如何进行能力封装使用呢?
一.了解共性,机制,思考可扩展,独立,可移植性。
首先在Android中通讯,我们必不可少的那便是Handler,Thread。
由于Android的机制,我们需要考虑
UI线程不能处理耗时操作,显然通讯属于耗时操作。所以我们用到Thread
子线程不能更新UI线程,所以我们需要用Handler机制来通知UI线程做出反应
由于服务器语种我们需要考虑
目前主要用2种语言开发的WebService Java和.net
结合上述的考虑,那么大致的思路是不有点眉目了!
试着写写吧!
首先创建一个类WebService
基本上请求有开始,正在请求,发生错误,成功,结束请求5种状态
我们便添加Handler处理消息的类别甄别,当然这里可以直接定义,而我这里是定一个内部类作为甄别类。
classMsgCode{publicfinalstaticintSTATR=0x01;//开始publicfinalstaticintERROR=0x02;//错误publicfinalstaticintSUSSCE=0x03;//成功publicfinalstaticintFINALY=0x04;//结束publicfinalstaticintPROGRESS=0x05;//正在请求中}
接下来我们想想我们WebService请求一般来说需要哪些参数,罗列一下我们需要下面6类。
服务器URL
命名空间URL
请求的函数名称
请求的参数列表
请求的服务器类别
Handler处理消息对象
罗列完毕,那我们的思路便更加明确了。这时候我们建立一个start函数,这里请求参数列表用Map便让key value的形式完全和webservice的参数形式对应了。
publicstaticvoidstart(finalStringsv_url,finalStringns_url,finalStringmthd,finalHashMap<String,Object>params,finalbooleanisdotnet,finalHandlercallback){newThread(newRunnable(){@Overridepublicvoidrun(){//webservice调用处理方法}}).start();}
现在来让我们具体用代码回顾一下上一篇文章讲的
Android如何进行WebService调用,我们定义一个调用的具体函数start_函数,参数与start相同。
staticvoidstart_(StringserviceUrl,StringnamespaceUrl,StringserviceMethod,HashMap<String,Object>params,booleanisDotNet,Handlerhandler){}
接下来我们一步一步的回顾一下上一篇讲的如何调用
//构建SoapSerializationEnvelopeSoapSerializationEnvelopeevlp=newSoapSerializationEnvelope(SoapEnvelope.VER11);//对应于Ksoap1.1规范//构建SoapObjectSoapObjectsoapobject=newSoapObject(namespaceUrl,serviceMethod);//构建传输的参数列表//设置SoapObjectevlp.bodyOut=soapobject;//你也可以如此evlp.setOutputSoapObject(soapobject);//设置是否为.netevlp.dotNet=isDotNet;//这里有个timeout超时我们可以定义一个在类里面定义静态常量50s作为超时时间可根据需要修改privatestaticinttimeout=1000*50;HttpTransportSEhts=newHttpTransportSE(serviceUrl,timeout);//调用注意,这里有个actionUrl是namespaceUrl+serviceMethod的结果,//一般是服务器?wsdl里面的targetNamespace+函数namehts.call(actionUrl,evlp);//接收结果Objectresult=evlp.getResponse();//或者Objectresult=evlp.bodyIn;
当然上面的代码直接copy过去是不能直接用的我们仔细想想,我们缺了哪些!
首先我们缺了构建参数列表好!下面我创建一个addParam函数通过遍历HashMap来添加参数列表
privatestaticvoidaddParam(SoapObjectsoapobject,HashMap<String,Object>params){//TODOAuto-generatedmethodstubif(params!=null&&!params.isEmpty()){Iteratoriter=params.entrySet().iterator();while(iter.hasNext()){Map.Entryentry=(Map.Entry)iter.next();Objectkey=entry.getKey();Objectval=entry.getValue();PropertyInfopi=newPropertyInfo();pi.setName(key.toString());pi.setValue(val);pi.setType(val.getClass());soapobject.addProperty(pi);//当然你如果只传字符串直接上面PropertyInfopi=newPropertyInfo();//以后的注释掉直接用下面的也行//soapobject.addProperty(key.toString(),val.toString());}}}
//构建传输的参数列表处加上下面的语句addParam(soapobject,params);
让我们再看看少了些什么?
对我们少了handler机制处理,来让我们加上!start_函数就变成下面这个样子
/***调用的具体函数**@paramserviceUrl*@paramnamespaceUrl*@paramserviceMethod*@paramparams*@paramisDotNet*@paramhandler*/staticvoidstart_(StringserviceUrl,StringnamespaceUrl,StringserviceMethod,HashMap<String,Object>params,booleanisDotNet,Handlerhandler){//TODOAuto-generatedmethodstubStringactionUrl=namespaceUrl+serviceMethod;handler.obtainMessage(MsgCode.STATR).sendToTarget();SoapObjectsoapobject=newSoapObject(namespaceUrl,serviceMethod);addParam(soapobject,params);SoapSerializationEnvelopeevlp=newSoapSerializationEnvelope(SoapEnvelope.VER11);evlp.bodyOut=soapobject;evlp.dotNet=isDotNet;evlp.setOutputSoapObject(soapobject);HttpTransportSEhts=newHttpTransportSE(serviceUrl,timeout);try{hts.call(actionUrl,evlp);Objectresult=evlp.getResponse();if(result.getClass().isAssignableFrom(SoapFault.class)){handler.obtainMessage(MsgCode.ERROR,result).sendToTarget();}else{handler.obtainMessage(MsgCode.SUSSCE,result).sendToTarget();}}catch(HttpResponseExceptione){//TODOAuto-generatedcatchblockhandler.obtainMessage(MsgCode.ERROR,e.getMessage()).sendToTarget();e.printStackTrace();}catch(IOExceptione){//TODOAuto-generatedcatchblockhandler.obtainMessage(MsgCode.ERROR,e.getMessage()).sendToTarget();e.printStackTrace();}catch(XmlPullParserExceptione){//TODOAuto-generatedcatchblockhandler.obtainMessage(MsgCode.ERROR,e.getMessage()).sendToTarget();e.printStackTrace();}handler.obtainMessage(MsgCode.FINALY).sendToTarget();}
这样我们一个完整的请求WebService类就构建完毕了!
这篇文章的内容也就结束了!
这时候用的朋友会发现一个问题。我们这个如果要传对象,我们该如何处理呢?
好的请大家接下来请期待下一篇文章《Android调用WebService系列之对象构建传递》
更多相关文章
- 箭头函数的基础使用
- Python技巧匿名函数、回调函数和高阶函数
- Android(安卓)MVP 构架初试
- Android中“分享”功能的实现
- JS调用Android里面的方法,Android调用JS里面的方法
- Android我还可以相信你多少系列文章二之音视频播放
- Android应用程序注册广播接收器(registerReceiver)的过程分析
- Cordova插件调用Android原生Activity
- Android(安卓)onTouchEvent, onClick及onLongClick的调用机制