在如今的應用程序中。不可能不使用到網絡,並且後臺必定是有server做爲支撐的。java
如今最多見的調用方式有HTTP的GET 。POST方式,返回JSON或者XML數據。android
但是也有一種常見的形式就是調用WebService。如今咱們來實現一下在Android端使用SOAP簡單對象訪問協議來調用WebService數據。git
基本的需求是依據某個手機號碼返回這個號碼的運營商。卡類型以及歸屬地等信息。github
(1)先從網上下載一個ksoap的jar包。放入項目的libs目錄下,我也提供百度網盤的下載:http://pan.baidu.com/s/1o6svnC2 。web
(2)推薦一個可以調用WebService的站點。上面提供了很是多的服務,http://www.webxml.com.cn/zh_cn/index.aspx 。網絡
(3)在Activity中的實現的代碼例如如下:主要作界面顯示操做。並初始化一些WebService調用的參數。如URL地址,命名空間。方法名稱,參數列表等。app
package com.example.testwebservice2; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class WebserviceActivity extends Activity { private Context context; private static final String URL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";// 請求的url private static final String NAMESPACE = "http://WebXml.com.cn/";// 請求的命名空間; private static final String METHODNAME = "getMobileCodeInfo"; // 方法名稱,得到國內手機號碼歸屬地省份,地區和手機卡類型信息; private EditText phoneNum; private Button query; private TextView showResult; private Handler handler = new Handler() {// 刷新界面; public void handleMessage(Message msg) { String myData = msg.getData().getString("data");// 這裏是全然解析好後的數據;用於顯示; if (myData != null || !"".equals(myData)) { showResult.setText(myData); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.context = this; initView(); query.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 手機號碼(段) String phoneSec = phoneNum.getText().toString().trim(); // 簡單推斷用戶輸入的手機號碼(段)是否合法 if ("".equals(phoneSec) || phoneSec.length() < 7) {// 輸入不合法。 phoneNum.setError("您輸入的手機號碼(段)有誤!"); // 給出錯誤提示 phoneNum.requestFocus(); // 將顯示查詢結果的TextView清空 phoneNum.setText(""); return; } ResponseOnClick(); // 輸入沒問題。開始請求數據; } }); } private void initView() { phoneNum = (EditText) findViewById(R.id.phone_sec); query = (Button) findViewById(R.id.query_btn); showResult = (TextView) findViewById(R.id.result_text); } private void ResponseOnClick() { HttpThread thread = new HttpThread(handler, context); HashMap<String, Object> params = new HashMap<String, Object>(); String phoneSec = phoneNum.getText().toString().trim();// 電話號碼; params.put("mobileCode", phoneSec);// mobileCode:字符串,手機號碼,最少前七位數字。 params.put("userId", "");// 字符串,免費用戶爲空字符串。 thread.doStart(URL, NAMESPACE, METHODNAME, params); } }
(4)新建一個線程類,繼承自Thread。主要作訪問WebService的網絡操做。ide
接收返回的數據並傳遞給Activity。svn
package com.example.testwebservice2; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapPrimitive; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.ProgressDialog; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; class HttpThread extends Thread { private Handler handler = null; private Context context = null; private String url = null; private String namespace = null; private String methodName = null; HashMap<String, Object> params = new HashMap<String, Object>();// 參數列表; private ProgressDialog progressDialog = null; // 構造函數 public HttpThread(Handler handler, Context context) { this.handler = handler; this.context = context; } /** * 啓動線程 */ /** * 要向server傳遞的四個參數各自是: (1)URL (2)命名空間 (3)方法名 (4)參數列表 * * @param url * @param namespace * @param methodName * @param params */ public void doStart(String url, String namespace, String methodName, HashMap<String, Object> params) { this.url = url; this.namespace = namespace; this.methodName = methodName; this.params = params; progressDialog = ProgressDialog.show(context, "提示", "正在請求請稍等...", true); this.start();// 啓動這個線程。 } /** * 線程執行 */ @Override public void run() { try { // web service 請求 SoapObject result = (SoapObject) CallWebService(); Log.i("HttpThread_getPropertyCount", result.getPropertyCount() + ""); Log.i("HttpThread_getProperty(0)", result.getProperty(0) + ""); // 構造數據 String value = null; if (result != null && result.getPropertyCount() > 0) { for (int i = 0; i < result.getPropertyCount(); i++) { SoapPrimitive primitive = (SoapPrimitive) result .getProperty(i); value = primitive.toString(); } /** * 這裏得到的value就是WebService的值: 18710498511:陝西 西安 陝西移動全球通卡 */ // Log.i("HttpThread_value", value); // 取消進度框 progressDialog.dismiss(); // 構造消息 Message message = handler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("data", value);// 傳遞到界面進行顯示。 message.setData(bundle); handler.sendMessage(message);// 傳遞到到Activity的handmessage()中進行處理; }// if } catch (Exception e) { e.printStackTrace(); } }// run(); private Object CallWebService() { String SOAP_ACTION = namespace + methodName;// 命名空間+方法名稱。 SoapObject request = new SoapObject(namespace, methodName);// 建立SoapObject實例 // 生成調用web service 方法的soap請求消息 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); // 設置.net web service envelope.dotNet = true; // 請求參數 if (params != null && !params.isEmpty()) { for (Iterator it = params.entrySet().iterator(); it.hasNext();) { Map.Entry<String, Object> e = (Entry) it.next(); request.addProperty(e.getKey().toString(), e.getValue()); } } // 發送請求 envelope.setOutputSoapObject(request); HttpTransportSE transport = new HttpTransportSE(url); SoapObject result = null; try { // web service請求 transport.call(SOAP_ACTION, envelope); result = (SoapObject) envelope.bodyIn; } catch (Exception ex) { ex.printStackTrace(); } Log.i("result", result.toString()); return result; }// CallWebService(); }// HttpThread類;
..函數
github主頁:https://github.com/chenyufeng1991 。歡迎你們訪問!