AsyncTask(異步任務)

什麼是AsyncTask?

AsyncTask,是android提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實現異步操作,並提供接口反饋當前異步執行的程度(可以通過接口實現UI進度更新),最後反饋執行的結果給UI主線程


當一個AsyncTask運行的過程中,4個方法的先後順序與作用:

onPreExecute()
在excute調用後立即在ui線程中執行,當任務執行之前開始調用此方法,可以在這裏顯示進度對話框。
doInBackground()
 onPreExecute() 完成後, 立即在後臺線程中運行,一般執行耗時操作
onProgressUpdate(Progress…) 
  可以使用進度條增加用戶體驗度。 此方法在主線程執行,用於顯示任務執行的進度。
onPostExecute()
後臺運算完成時在ui線程中調用,相當於Handler 處理UI的方式,在這裏面可以使用在doInBackground 得到的結果處理操作UI。


要使用AsyncTask工作我們要提供三個泛型參數,並重載幾個方法。

AsyncTask需要定義了三種泛型類型 Params,Progress和Result。

Params 啓動任務執行的輸入參數,比如HTTP請求的URL。 

Progress 後臺任務執行的百分比。

Result 後臺執行任務最終返回的結果,比如String。



AsyncTask用在需要在主線程中調用、在背景線程中執行耗時任務、並且在主線程中返回結果的場合。

下面就是一個簡單的ProgressDialog 與AsyncTask的實現 。

private class DownloadAsyncTask extends AsyncTask<String, Integer, String> {      
       ProgressDialog pdialog;    

       public DownloadAsyncTask (Context context){    
            //初始化數據
           pdialog = new ProgressDialog(context, 0);        
           pdialog.setButton("取消", new DialogInterface.OnClickListener() {    
            public void onClick(DialogInterface dialog, int i) {    
             dialog.cancel();    
            }    
           });    
           pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {    
            public void onCancel(DialogInterface dialog) {    
             finish();    
            }    
           });  
           pdialog.setTitle("第一次使用,正在下載數據...");  
           pdialog.setCancelable(true);    
           pdialog.setMax(100);    
           pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);    
              
       }  
         
       @Override    
       protected String doInBackground(String... params) {    
           //耗時操作

           return null;  
       }  
   
       @Override    
       protected void onCancelled() {    
           super.onCancelled();    
       }    
   
       @Override    
       protected void onPostExecute(String result) {    
        //執行完畢後 dialog消失
           pdialog.dismiss();      
       }    
   
       @Override    
       protected void onPreExecute() {  
        //執行開始顯示dialog
          pdialog.show();   
       }    
   
       @Override    
       protected void onProgressUpdate(Integer... values) {      

       }    
    } 

 

對於寫好的異步任務類,調用方法爲:

DownloadAsyncTask task = new DownloadAsyncTask (context);    
 task.execute("");   

使用AsyncTask類,以下是幾條準則:

Task的實例必須在主線程中創建; 

execute方法必須在主線程中調用;

task只能被執行一次,否則多次調用時將會出現異常;

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章