Android asyncTask

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


  1. package com.android.Webservice;  
  2. import java.util.HashMap;  
  3. import java.util.Iterator;  
  4. import java.util.Map.Entry;  
  5. import org.ksoap2.SoapEnvelope;  
  6. import org.ksoap2.serialization.SoapObject;  
  7. import org.ksoap2.serialization.SoapSerializationEnvelope;  
  8. import org.ksoap2.transport.AndroidHttpTransport;  
  9. import android.os.AsyncTask;  
  10. import android.os.Message;  
  11. import android.util.Log;  
  12. public class SOAPWebservice extends AsyncTask<Object, Void, Object> {  
  13.     /* 
  14.      *异步调用 
  15.      */  
  16.     @SuppressWarnings("unchecked")  
  17.       
  18.     @Override  
  19.     protected Object doInBackground(Object... params) {   
  20.         // parameters   
  21.         String serviceUrl = params[0].toString();  
  22.         String nameSpace = params[1].toString();  
  23.         String methodName = params[2].toString();  
  24.         HashMap<String, String> hashMap = (HashMap<String, String>)params[3];  
  25.           
  26.         try {  
  27.             String SOAP_ACTION = nameSpace + methodName;  
  28.             // 第1步: 创建SoapObject对象,指定WebService的命名空间和调用方法名   
  29.             SoapObject request = new SoapObject(nameSpace, methodName);  
  30.             // 第2步: 创建WebService方法的参数   
  31.             Iterator<Entry<String, String>> iterator = hashMap.entrySet().iterator();    
  32.             while (iterator.hasNext()) {  
  33.                 Entry<String, String> entry = (Entry<String, String>) iterator.next();  
  34.                 Object value= entry.getValue();  
  35.                 Object key =entry.getKey();  
  36.                 request.addProperty(key.toString(), value.toString());  
  37.             }  
  38.             // 第3步:创建SoapSerializationEnvelope对象,并指定WebService的版本   
  39.             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);  
  40.             // 设置bodyOut属性   
  41.             envelope.bodyOut = request;  
  42.             // 设置.net的Webservice ,要不然会出错   
  43.             envelope.dotNet = true;  
  44.             // 第4步:创建HttpTransportSE对象,并指定WSDL文档的URL   
  45.             AndroidHttpTransport ht = new AndroidHttpTransport(serviceUrl);  
  46.             ht.debug = true;  
  47.             // 调用WebService   
  48.             ht.call(SOAP_ACTION, envelope);  
  49.               
  50.             // 第6步: 使用getResponse方法获得WebService方法的返回结果   
  51.             SoapObject soapObject = (SoapObject) envelope.getResponse();  
  52.             return soapObject;  
  53.         } catch (Exception e) {  
  54.             Log.e("WEB_exception", e.getMessage());  
  55.             e.printStackTrace();  
  56.         }  
  57.         return null;  
  58.     }  
  59.       
  60.     @Override    
  61.     protected void onPostExecute(Object result) {    
  62.         Message msg = new Message();  
  63.         msg.what = 1;  
  64.         msg.obj = result;  
  65.         handleMessage(msg);  
  66.     }    
  67.       
  68.     public boolean handleMessage(Message msg) {  
  69.         // TODO Auto-generated method stub   
  70.         return false;  
  71.     }  
  72.       
  73.     /* 
  74.      * 同步调用 
  75.      */  
  76.     /* 
  77.     public SoapObject getWebService(String serviceUrl, String nameSpace, 
  78.             String methodName, HashMap<String, String> hashMap) { 
  79.         try { 
  80.             String SOAP_ACTION = nameSpace + methodName; 
  81.              
  82.             // 第1步: 创建SoapObject对象,指定WebService的命名空间和调用方法名 
  83.             SoapObject request = new SoapObject(nameSpace, methodName); 
  84.             // 第2步: 创建WebService方法的参数 
  85.             Iterator<Entry<String, String>> iterator = hashMap.entrySet().iterator();   
  86.             while (iterator.hasNext()) { 
  87.                 Entry<String, String> entry = (Entry<String, String>) iterator.next(); 
  88.                 Object value= entry.getValue(); 
  89.                 Object key =entry.getKey(); 
  90.                 request.addProperty(key.toString(), value.toString()); 
  91.             } 
  92.             // 第3步:创建SoapSerializationEnvelope对象,并指定WebService的版本 
  93.             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( 
  94.                     SoapEnvelope.VER11); 
  95.             // 设置bodyOut属性 
  96.             envelope.bodyOut = request; 
  97.             // 设置.net的webservice ,要不然会出错 
  98.             envelope.dotNet = true; 
  99.             // envelope.setOutputSoapObject(request); 
  100.             // 第4步:创建HttpTransportSE对象,并指定WSDL文档的URL 
  101.             // HttpTransportSE ht = new HttpTransportSE(serviceUrl); 
  102.             AndroidHttpTransport ht = new AndroidHttpTransport(serviceUrl); 
  103.             ht.debug = true; 
  104.             // 调用WebService 
  105.             ht.call(SOAP_ACTION, envelope); 
  106.             // 第6步: 使用getResponse方法获得WebService方法的返回结果 
  107.             SoapObject soapObject = (SoapObject) envelope.getResponse(); 
  108.              
  109.             return soapObject; 
  110.              
  111.         } catch (Exception e) { 
  112.             Log.e("WEB_exception", e.getMessage()); 
  113.             e.printStackTrace(); 
  114.         } 
  115.         return null; 
  116.     } 
  117.     */  
  118. }  

 


Webservice.java


  1. package com.android.Webservice;  
  2. import java.util.HashMap;  
  3. import org.ksoap2.serialization.SoapObject;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.os.Message;  
  7. import android.util.Log;  
  8. public class Webservice extends Activity {  
  9.     private static final String serviceUrl = "webservice地址";  
  10.     private static final String nameSpace = "命名空间";  
  11.     private static final String methodName = "方法名";  
  12.       
  13.     /** Called when the activity is first created. */  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.           
  19.         HashMap<String, String> hashMap = new HashMap<String, String>();  
  20.         hashMap.put("secuCode""sh600036");  
  21.         hashMap.put("count""100");  
  22.           
  23.         try {  
  24.             new SOAPWebservice(){  
  25.                 @Override  
  26.                 public boolean handleMessage(Message msg) {  
  27.                     switch (msg.what) {  
  28.                         case 1:  
  29.                             onFinishLoadData((SoapObject)msg.obj);  
  30.                             break;  
  31.                         }  
  32.                     return false;  
  33.                 }  
  34.             }.execute(serviceUrl, nameSpace, methodName, hashMap);  
  35.         }catch(Exception e) {  
  36.             e.printStackTrace();  
  37.         }  
  38.     }  
  39.       
  40.     public void onFinishLoadData(SoapObject soapObject) {  
  41.         for (int i = 0; i < soapObject.getPropertyCount(); i++) {  
  42.             SoapObject object1 = (SoapObject)soapObject.getProperty(i);  
  43.             Log.e("TradingDay", (object1.getProperty("TradingDay")).toString());  
  44.         }  
  45.     }  
  46. }  

你可能感兴趣的:(AsyncTask)