Android AsyncTask簡單用法

weixin_34402090發表於2012-11-12

三個泛型引數:

  Param 任務執行器需要的資料型別

  Progress 後臺計算中使用的進度單位資料型別

  Result 後臺計算返回結果的資料型別有些引數是可以設定為不使用的,只要傳遞為Void型即可,比如AsyncTask

四個步驟:onPreExecute(),執行預處理,它執行於UI執行緒,可以為後臺任務做一些準備工作,比如繪製一個進度條控制元件。doInBackground(Params),後臺程式執行的具體計算在這裡實 現,doInBackground(Params)AsyncTask的關鍵,此方法必須過載。在這個方法內可以使用 publishProgress(Progress)改變當前的進度值。onProgressUpdate(Progress),執行於UI執行緒。如果在doInBackground(Params)中 使用了publishProgress(Progress),就會觸發這個方法。在這裡可以對進度條控制元件根據進度值做出具體的響應。onPostExecute(Result),執行於UI執行緒,可以對後臺任務的結果做出處理,結果就是doInBackground(Params)的返回值。此方法也要經常過載,如果Resultnull表明後臺任務沒有完成(被取消或者出現異常)

  這4個方法都不能手動呼叫。而且除了doInBackground(Params)方法,其餘3個方法都是被UI執行緒所呼叫的,所以要求:1) AsyncTask的例項必須在UI thread中建立;2) AsyncTask.execute方法必須在UI thread中呼叫;

Task只能被執行一次,多次呼叫時將會出現異常,而且是不能手動停止。

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class AsyncTaskTest extends Activity { 
    TextView tv; 
    final String TAG="AsyncTaskTest"; 
  
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        tv = (TextView) findViewById(R.id.label); 
        new MyTask().execute(6, 12, 7); 
  
    } 
  
    class MyTask extends AsyncTask<Integer, Integer, Integer> { 
  
        @Override 
        protected void onPreExecute() { 
            super.onPreExecute(); 
            Log.d(TAG, "onPreExecute()"); 
        } 
  
        @Override 
        protected Integer doInBackground(Integer... params) { 
            Log.d(TAG, "doInBackground()"); 
            int p = 0; 
            for (int index = 0; index < params.length; index++) { 
                int num = params[index]; 
                for (int j = 0; j < num; j++) { 
                    if (num - j <= 0) { 
                        break; 
                    } 
                    p++; 
                    publishProgress(p); 
                    try { 
                        Thread.sleep(500); 
                    } catch (InterruptedException e) { 
                        e.printStackTrace(); 
                    } 
                } 
            } 
            return p; 
        }
  
        @Override 
        protected void onProgressUpdate(Integer... progress) { 
            Log.d(TAG, "onProgressUpdate()"); 
            tv.append("\nProgress: " + progress[0]); 
        } 
  
        @Override 
        protected void onPostExecute(Integer result) { 
            Log.d(TAG, "onPostExecute()"); 
            tv.append("\nFinished. Result: " + result); 
        } 
  
        @Override 
        protected void onCancelled() { 
            super.onCancelled(); 
            Log.d(TAG, "onCancelled()");
        }
    }
}  

 

相關文章