這篇文章給大家介紹Android中如何調(diào)用WebService,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、綏化網(wǎng)站維護(hù)、網(wǎng)站推廣。
首先在Android中通訊,我們必不可少的那便是Handler,Thread。
由于Android的機(jī)制,我們需要考慮
UI線程不能處理耗時(shí)操作,顯然通訊屬于耗時(shí)操作。所以我們用到Thread
子線程不能更新UI線程,所以我們需要用Handler機(jī)制來(lái)通知UI線程做出反應(yīng)
由于服務(wù)器語(yǔ)種我們需要考慮
目前主要用2種語(yǔ)言開發(fā)的WebService Java和.net
結(jié)合上述的考慮,那么大致的思路是不有點(diǎn)眉目了!
試著寫寫吧!
首先創(chuàng)建一個(gè)類WebService
基本上請(qǐng)求有開始,正在請(qǐng)求,發(fā)生錯(cuò)誤,成功,結(jié)束請(qǐng)求5種狀態(tài)
我們便添加Handler處理消息的類別甄別,當(dāng)然這里可以直接定義,而我這里是定一個(gè)內(nèi)部類作為甄別類。
class MsgCode { public final static int STATR = 0x01; //開始 public final static int ERROR = 0x02; //錯(cuò)誤 public final static int SUSSCE = 0x03;//成功 public final static int FINALY = 0x04;//結(jié)束 public final static int PROGRESS = 0x05;//正在請(qǐng)求中 }
接下來(lái)我們想想我們WebService請(qǐng)求一般來(lái)說(shuō)需要哪些參數(shù),羅列一下我們需要下面6類。
服務(wù)器URL
命名空間URL
請(qǐng)求的函數(shù)名稱
請(qǐng)求的參數(shù)列表
請(qǐng)求的服務(wù)器類別
Handler處理消息對(duì)象
羅列完畢,那我們的思路便更加明確了。這時(shí)候我們建立一個(gè)start函數(shù),這里請(qǐng)求參數(shù)列表用Map便讓key value的形式完全和webservice的參數(shù)形式對(duì)應(yīng)了。
public static void start(final String sv_url, final String ns_url, final String mthd, final HashMapparams, final boolean isdotnet, final Handler callback) { new Thread(new Runnable() { @Override public void run() { //webservice調(diào)用處理方法 } }).start(); }
現(xiàn)在來(lái)讓我們具體用代碼回顧一下上一篇文章講的
Android如何進(jìn)行WebService調(diào)用,我們定義一個(gè)調(diào)用的具體函數(shù)start_函數(shù),參數(shù)與start相同。
static void start_(String serviceUrl, String namespaceUrl, String serviceMethod, HashMapparams, boolean isDotNet, Handler handler) { }
接下來(lái)我們一步一步的回顧一下上一篇講的如何調(diào)用
//構(gòu)建SoapSerializationEnvelope SoapSerializationEnvelope evlp = new SoapSerializationEnvelope( SoapEnvelope.VER11);//對(duì)應(yīng)于Ksoap 1.1規(guī)范 //構(gòu)建SoapObject SoapObject soapobject = new SoapObject(namespaceUrl, serviceMethod); //構(gòu)建傳輸?shù)膮?shù)列表 //設(shè)置SoapObject evlp.bodyOut = soapobject; //你也可以如此 evlp.setOutputSoapObject(soapobject); //設(shè)置是否為.net evlp.dotNet = isDotNet; //這里有個(gè)timeout超時(shí)我們可以定義一個(gè)在類里面定義靜態(tài)常量50s作為超時(shí)時(shí)間可根據(jù)需要修改 private static int timeout = 1000 * 50; HttpTransportSE hts = new HttpTransportSE(serviceUrl, timeout); //調(diào)用 注意,這里有個(gè)actionUrl是namespaceUrl+serviceMethod的結(jié)果, //一般是服務(wù)器?wsdl 里面的targetNamespace+ 函數(shù)name hts.call(actionUrl, evlp); //接收結(jié)果 Object result = evlp.getResponse(); //或者 Object result = evlp.bodyIn;
當(dāng)然上面的代碼直接copy過(guò)去是不能直接用的我們仔細(xì)想想,我們?nèi)绷四男?/p>
首先我們?nèi)绷藰?gòu)建參數(shù)列表好!下面我創(chuàng)建一個(gè)addParam函數(shù)通過(guò)遍歷HashMap來(lái)添加參數(shù)列表
private static void addParam(SoapObject soapobject, HashMapparams) { // TODO Auto-generated method stub if (params != null && !params.isEmpty()) { Iterator iter = params.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); PropertyInfo pi = new PropertyInfo(); pi.setName(key.toString()); pi.setValue(val); pi.setType(val.getClass()); soapobject.addProperty(pi); //當(dāng)然你如果只傳字符串直接上面PropertyInfo pi = new PropertyInfo(); //以后的注釋掉直接用下面的也行 // soapobject.addProperty(key.toString(), val.toString()); } } }
//構(gòu)建傳輸?shù)膮?shù)列表處加上下面的語(yǔ)句 addParam(soapobject, params);
讓我們?cè)倏纯瓷倭诵┦裁矗?/p>
對(duì)我們少了handler機(jī)制處理,來(lái)讓我們加上!start_函數(shù)就變成下面這個(gè)樣子
/** * 調(diào)用的具體函數(shù) * * @param serviceUrl * @param namespaceUrl * @param serviceMethod * @param params * @param isDotNet * @param handler */ static void start_(String serviceUrl, String namespaceUrl, String serviceMethod, HashMapparams, boolean isDotNet, Handler handler) { // TODO Auto-generated method stub String actionUrl = namespaceUrl + serviceMethod; handler.obtainMessage(MsgCode.STATR).sendToTarget(); SoapObject soapobject = new SoapObject(namespaceUrl, serviceMethod); addParam(soapobject, params); SoapSerializationEnvelope evlp = new SoapSerializationEnvelope( SoapEnvelope.VER11); evlp.bodyOut = soapobject; evlp.dotNet = isDotNet; evlp.setOutputSoapObject(soapobject); HttpTransportSE hts = new HttpTransportSE(serviceUrl, timeout); try { hts.call(actionUrl, evlp); Object result = evlp.getResponse(); if (result.getClass().isAssignableFrom(SoapFault.class)) { handler.obtainMessage(MsgCode.ERROR, result).sendToTarget(); } else { handler.obtainMessage(MsgCode.SUSSCE, result).sendToTarget(); } } catch (HttpResponseException e) { // TODO Auto-generated catch block handler.obtainMessage(MsgCode.ERROR, e.getMessage()).sendToTarget(); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block handler.obtainMessage(MsgCode.ERROR, e.getMessage()).sendToTarget(); e.printStackTrace(); } catch (XmlPullParserException e) { // TODO Auto-generated catch block handler.obtainMessage(MsgCode.ERROR, e.getMessage()).sendToTarget(); e.printStackTrace(); } handler.obtainMessage(MsgCode.FINALY).sendToTarget(); }
關(guān)于Android中如何調(diào)用WebService就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。