上一篇,我们简单的讲述了Android如何进行WebService调用!

而往往我们在项目中会先封装一下再使用!那么我们如何进行能力封装使用呢?

一.了解共性,机制,思考可扩展,独立,可移植性。

首先在Android中通讯,我们必不可少的那便是Handler,Thread。

由于Android的机制,我们需要考虑

  1. UI线程不能处理耗时操作,显然通讯属于耗时操作。所以我们用到Thread

  2. 子线程不能更新UI线程,所以我们需要用Handler机制来通知UI线程做出反应

由于服务器语种我们需要考虑

目前主要用2种语言开发的WebService Java和.net

结合上述的考虑,那么大致的思路是不有点眉目了!

试着写写吧!

首先创建一个类WebService

基本上请求有开始,正在请求,发生错误,成功,结束请求5种状态

我们便添加Handler处理消息的类别甄别,当然这里可以直接定义,而我这里是定一个内部类作为甄别类。

classMsgCode{publicfinalstaticintSTATR=0x01;//开始publicfinalstaticintERROR=0x02;//错误publicfinalstaticintSUSSCE=0x03;//成功publicfinalstaticintFINALY=0x04;//结束publicfinalstaticintPROGRESS=0x05;//正在请求中}

接下来我们想想我们WebService请求一般来说需要哪些参数,罗列一下我们需要下面6类。

  1. 服务器URL

  2. 命名空间URL

  3. 请求的函数名称

  4. 请求的参数列表

  5. 请求的服务器类别

  6. 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系列之对象构建传递》

更多相关文章

  1. 箭头函数的基础使用
  2. Python技巧匿名函数、回调函数和高阶函数
  3. Android(安卓)MVP 构架初试
  4. Android中“分享”功能的实现
  5. JS调用Android里面的方法,Android调用JS里面的方法
  6. Android我还可以相信你多少系列文章二之音视频播放
  7. Android应用程序注册广播接收器(registerReceiver)的过程分析
  8. Cordova插件调用Android原生Activity
  9. Android(安卓)onTouchEvent, onClick及onLongClick的调用机制

随机推荐

  1. android:process=":remote"
  2. android 8.1 移除hifi_sensor feature
  3. android基础(对话框风格Activity实现)
  4. 2010.10.26———Android(安卓)01
  5. sadasd
  6. Android帧布局-实现渐变效果
  7. Android修改PackageInstaller自动安装指
  8. Android常用控件
  9. 查看android路由表
  10. 一张图片覆盖在另一个图片上