AsyncTask是抽象類別,子類必須實現抽象方法doInBackground(Params... p) ,在此方法中實現任務的執行工作,比如串連網路擷取資料等。
通常還應該實現onPostExecute(Result r) 方法,因為應用程式關心的結果在此方法中返回。需要注意的是AsyncTask一定要在主線程中建立執行個體。AsyncTask定義了三種泛型型別 Params,Progress和Result。
* Params 啟動任務執行的輸入參數,比如HTTP請求的URL。
* Progress 背景工作執行的百分比。
* Result 後台執行任務最終返回的結果,比如String。
AsyncTask 的執行分為四個步驟,每一步都對應一個回調方法,需要注意的是這些方法不應該由應用程式調用,開發人員需要做的就是實現這些方法。在任務的執行過程中,這些方法被自動調用。
* onPreExecute() 當任務執行之前開始調用此方法,可以在這裡顯示進度對話方塊。
* doInBackground(Params...) 此方法在後台線程 執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress...)來更新任務的進度。
* onProgressUpdate(Progress...) 此方法在主線程 執行,用於顯示任務執行的進度。
* onPostExecute(Result) 此方法在主線程 執行,任務執行的結果作為此方法的參數返回。
貼一個完整的例子:
SOAPWebservice.java
package com.android.Webservice;import java.util.HashMap;import java.util.Iterator;import java.util.Map.Entry;import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObject;import org.ksoap2.serialization.SoapSerializationEnvelope;import org.ksoap2.transport.AndroidHttpTransport;import android.os.AsyncTask;import android.os.Message;import android.util.Log;public class SOAPWebservice extends AsyncTask<Object, Void, Object> {/* *非同步呼叫 */@SuppressWarnings("unchecked")@Overrideprotected Object doInBackground(Object... params) { // parametersString serviceUrl = params[0].toString();String nameSpace = params[1].toString();String methodName = params[2].toString();HashMap<String, String> hashMap = (HashMap<String, String>)params[3];try {String SOAP_ACTION = nameSpace + methodName;// 第1步: 建立SoapObject對象,指定WebService的命名空間和調用方法名SoapObject request = new SoapObject(nameSpace, methodName);// 第2步: 建立WebService方法的參數Iterator<Entry<String, String>> iterator = hashMap.entrySet().iterator(); while (iterator.hasNext()) {Entry<String, String> entry = (Entry<String, String>) iterator.next();Object value= entry.getValue();Object key =entry.getKey();request.addProperty(key.toString(), value.toString());}// 第3步:建立SoapSerializationEnvelope對象,並指定WebService的版本SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);// 設定bodyOut屬性envelope.bodyOut = request;// 設定.net的Webservice ,要不然會出錯envelope.dotNet = true;// 第4步:建立HttpTransportSE對象,並指定WSDL文檔的URLAndroidHttpTransport ht = new AndroidHttpTransport(serviceUrl);ht.debug = true;// 調用WebServiceht.call(SOAP_ACTION, envelope);// 第6步: 使用getResponse方法獲得WebService方法的返回結果SoapObject soapObject = (SoapObject) envelope.getResponse();return soapObject;} catch (Exception e) {Log.e("WEB_exception", e.getMessage());e.printStackTrace();}return null;}@Override protected void onPostExecute(Object result) { Message msg = new Message();msg.what = 1;msg.obj = result;handleMessage(msg);} public boolean handleMessage(Message msg) {// TODO Auto-generated method stubreturn false;}/* * 同步調用 *//*public SoapObject getWebService(String serviceUrl, String nameSpace,String methodName, HashMap<String, String> hashMap) {try {String SOAP_ACTION = nameSpace + methodName;// 第1步: 建立SoapObject對象,指定WebService的命名空間和調用方法名SoapObject request = new SoapObject(nameSpace, methodName);// 第2步: 建立WebService方法的參數Iterator<Entry<String, String>> iterator = hashMap.entrySet().iterator(); while (iterator.hasNext()) {Entry<String, String> entry = (Entry<String, String>) iterator.next();Object value= entry.getValue();Object key =entry.getKey();request.addProperty(key.toString(), value.toString());}// 第3步:建立SoapSerializationEnvelope對象,並指定WebService的版本SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);// 設定bodyOut屬性envelope.bodyOut = request;// 設定.net的webservice ,要不然會出錯envelope.dotNet = true;// envelope.setOutputSoapObject(request);// 第4步:建立HttpTransportSE對象,並指定WSDL文檔的URL// HttpTransportSE ht = new HttpTransportSE(serviceUrl);AndroidHttpTransport ht = new AndroidHttpTransport(serviceUrl);ht.debug = true;// 調用WebServiceht.call(SOAP_ACTION, envelope);// 第6步: 使用getResponse方法獲得WebService方法的返回結果SoapObject soapObject = (SoapObject) envelope.getResponse();return soapObject;} catch (Exception e) {Log.e("WEB_exception", e.getMessage());e.printStackTrace();}return null;}*/}
Webservice.java
package com.android.Webservice;import java.util.HashMap;import org.ksoap2.serialization.SoapObject;import android.app.Activity;import android.os.Bundle;import android.os.Message;import android.util.Log;public class Webservice extends Activity {private static final String serviceUrl = "webservice地址";private static final String nameSpace = "命名空間";private static final String methodName = "方法名"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); HashMap<String, String> hashMap = new HashMap<String, String>(); hashMap.put("secuCode", "sh600036"); hashMap.put("count", "100"); try { new SOAPWebservice(){ @Override public boolean handleMessage(Message msg) { switch (msg.what) { case 1: onFinishLoadData((SoapObject)msg.obj); break; } return false; } }.execute(serviceUrl, nameSpace, methodName, hashMap); }catch(Exception e) { e.printStackTrace(); } } public void onFinishLoadData(SoapObject soapObject) { for (int i = 0; i < soapObject.getPropertyCount(); i++) { SoapObject object1 = (SoapObject)soapObject.getProperty(i); Log.e("TradingDay", (object1.getProperty("TradingDay")).toString()); } }}
文章源處:http://blog.csdn.net/ASIANJIANG/article/details/5672693