您好,登錄后才能下訂單哦!
這篇文章給大家介紹Android中如何調用WebService,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
首先在Android中通訊,我們必不可少的那便是Handler,Thread。
由于Android的機制,我們需要考慮
UI線程不能處理耗時操作,顯然通訊屬于耗時操作。所以我們用到Thread
子線程不能更新UI線程,所以我們需要用Handler機制來通知UI線程做出反應
由于服務器語種我們需要考慮
目前主要用2種語言開發的WebService Java和.net
結合上述的考慮,那么大致的思路是不有點眉目了!
試著寫寫吧!
首先創建一個類WebService
基本上請求有開始,正在請求,發生錯誤,成功,結束請求5種狀態
我們便添加Handler處理消息的類別甄別,當然這里可以直接定義,而我這里是定一個內部類作為甄別類。
class MsgCode { public final static int STATR = 0x01; //開始 public final static int ERROR = 0x02; //錯誤 public final static int SUSSCE = 0x03;//成功 public final static int FINALY = 0x04;//結束 public final static int PROGRESS = 0x05;//正在請求中 }
接下來我們想想我們WebService請求一般來說需要哪些參數,羅列一下我們需要下面6類。
服務器URL
命名空間URL
請求的函數名稱
請求的參數列表
請求的服務器類別
Handler處理消息對象
羅列完畢,那我們的思路便更加明確了。這時候我們建立一個start函數,這里請求參數列表用Map便讓key value的形式完全和webservice的參數形式對應了。
public static void start(final String sv_url, final String ns_url, final String mthd, final HashMap<String, Object> params, final boolean isdotnet, final Handler callback) { new Thread(new Runnable() { @Override public void run() { //webservice調用處理方法 } }).start(); }
現在來讓我們具體用代碼回顧一下上一篇文章講的
Android如何進行WebService調用,我們定義一個調用的具體函數start_函數,參數與start相同。
static void start_(String serviceUrl, String namespaceUrl, String serviceMethod, HashMap<String, Object> params, boolean isDotNet, Handler handler) { }
接下來我們一步一步的回顧一下上一篇講的如何調用
//構建SoapSerializationEnvelope SoapSerializationEnvelope evlp = new SoapSerializationEnvelope( SoapEnvelope.VER11);//對應于Ksoap 1.1規范 //構建SoapObject SoapObject soapobject = new SoapObject(namespaceUrl, serviceMethod); //構建傳輸的參數列表 //設置SoapObject evlp.bodyOut = soapobject; //你也可以如此 evlp.setOutputSoapObject(soapobject); //設置是否為.net evlp.dotNet = isDotNet; //這里有個timeout超時我們可以定義一個在類里面定義靜態常量50s作為超時時間可根據需要修改 private static int timeout = 1000 * 50; HttpTransportSE hts = new HttpTransportSE(serviceUrl, timeout); //調用 注意,這里有個actionUrl是namespaceUrl+serviceMethod的結果, //一般是服務器?wsdl 里面的targetNamespace+ 函數name hts.call(actionUrl, evlp); //接收結果 Object result = evlp.getResponse(); //或者 Object result = evlp.bodyIn;
當然上面的代碼直接copy過去是不能直接用的我們仔細想想,我們缺了哪些!
首先我們缺了構建參數列表好!下面我創建一個addParam函數通過遍歷HashMap來添加參數列表
private static void addParam(SoapObject soapobject, HashMap<String, Object> params) { // 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); //當然你如果只傳字符串直接上面PropertyInfo pi = new PropertyInfo(); //以后的注釋掉直接用下面的也行 // soapobject.addProperty(key.toString(), val.toString()); } } }
//構建傳輸的參數列表處加上下面的語句 addParam(soapobject, params);
讓我們再看看少了些什么?
對我們少了handler機制處理,來讓我們加上!start_函數就變成下面這個樣子
/** * 調用的具體函數 * * @param serviceUrl * @param namespaceUrl * @param serviceMethod * @param params * @param isDotNet * @param handler */ static void start_(String serviceUrl, String namespaceUrl, String serviceMethod, HashMap<String, Object> params, 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(); }
關于Android中如何調用WebService就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。