在現在的應用程序中。不可能不使用到網絡,而且后台一定是有server作為支撐的。
現在最常見的調用方式有HTTP的GET 。POST方式,返回JSON或者XML數據。
可是也有一種常見的形式就是調用WebService。現在我們來實現一下在Android端使用SOAP簡單對象訪問協議來調用WebService數據。
基本的需求是依據某個手機號碼返回這個號碼的運營商。卡類型以及歸屬地等信息。
(1)先從網上下載一個ksoap的jar包。放入項目的libs目錄下,我也提供百度網盤的下載:http://pan.baidu.com/s/1o6svnC2 。
(2)推薦一個能夠調用WebService的站點。上面提供了非常多的服務,http://www.webxml.com.cn/zh_cn/index.aspx 。
(3)在Activity中的實現的代碼例如以下:主要做界面顯示操作。並初始化一些WebService調用的參數。如URL地址,命名空間。方法名稱,參數列表等。
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的網絡操作。
接收返回的數據並傳遞給Activity。
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類;
(5)程序執行結果如圖:
..
github主頁:https://github.com/chenyufeng1991 。歡迎大家訪問!
