亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android中如何調用WebService

發布時間:2021-07-12 14:00:37 來源:億速云 閱讀:123 作者:Leah 欄目:移動開發

這篇文章給大家介紹Android中如何調用WebService,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

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

由于Android的機制,我們需要考慮

  1. UI線程不能處理耗時操作,顯然通訊屬于耗時操作。所以我們用到Thread

  2. 子線程不能更新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類。

  1. 服務器URL

  2. 命名空間URL

  3. 請求的函數名稱

  4. 請求的參數列表

  5. 請求的服務器類別

  6. 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就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东乡县| 龙川县| 南汇区| 南漳县| 平凉市| 南溪县| 荥经县| 临澧县| 灵寿县| 内丘县| 南川市| 邮箱| 本溪市| 神木县| 太仆寺旗| 宜良县| 手机| 平山县| 固安县| 赣州市| 临邑县| 高青县| 蚌埠市| 芜湖县| 西乌珠穆沁旗| 民乐县| 尼木县| 翁源县| 淮南市| 怀远县| 青海省| 崇州市| 峡江县| 泽普县| 惠安县| 张北县| 中方县| 抚宁县| 邵阳县| 台湾省| 长治县|