1. 程式人生 > >Android 子執行緒UI更新操作之二------AsyncTask

Android 子執行緒UI更新操作之二------AsyncTask

為了更方便的對子執行緒的中的UI進行操作,android提供了一些好用的工具,比如AsyncTask。藉助這個就可以簡單的從子執行緒切換到主執行緒。

當然這個工具也是基於非同步訊息處理機制的,只是安卓做了很好的封裝。

首先要說明的是AsyncTask是一個抽線類,要使用它,就必須先建立一個子類再去實現實現相關功能

該抽象類的宣告如下

public abstract class AsyncTask<Params, Progress, Result> 

Params:開始非同步任務執行時傳入的引數型別;

Progress:非同步任務執行過程中,返回下載進度值的型別;

Result:

非同步任務執行完成後,返回的結果型別;

一個簡單的自定義類可以這麼寫

class MyTask extends AsyncTask<Void, Integer, Boolean>

這裡將傳入引數設定為空,是因為我們暫時不需要傳入引數給後臺任務

當然現在的我們自定義的類還只能算是一個空任務,內在並沒有什麼邏輯。為了能讓我們的自定義類擔當大任我們還需要重寫幾個方法

1.onPreExecute()

這個方法會在後臺任務開始執行之間呼叫,在主執行緒執行。用於進行一些介面上的初始化操作,比如顯示一個進度條對話方塊等。

2.doInBackground(Params)

這個方法中的所有程式碼都會在子執行緒中執行。任務完成後再通過return語句將任務結果返回。注意這裡並不能進行UI操作。如果說需要反饋當前任務的執行進度,可以呼叫publishProgress(Progress...)方法來完成。

3.onProgressUpdate(Progress...)

當在後臺任務中呼叫了publishProgress(Progress...)方法後,這個方法就很快會被呼叫,方法中攜帶的引數就是在後臺任務中傳遞過來的。在這個方法中可以對UI進行操作。

4.onPostExecute(Result)

當任務執行完畢並通過return返回後,該方法就會被呼叫。可以通過返回的資料進行UI操作。

class MyTask extends AsyncTask<Void, Integer, Boolean> {  
  
    @Override  
    protected void onPreExecute() {  
        progressDialog.show();  
    }  
  
    @Override  
    protected Boolean doInBackground(Void... params) {  
        try {  
            while (true) {  
                int downloadPercent = doDownload();  
                publishProgress(downloadPercent);  
                if (downloadPercent >= 100) {  
                    break;  
                }  
            }  
        } catch (Exception e) {  
            return false;  
        }  
        return true;  
    }  
  
    @Override  
    protected void onProgressUpdate(Integer... values) {  
        progressDialog.setMessage("當前下載進度:" + values[0] + "%");  
    }  
  
    @Override  
    protected void onPostExecute(Boolean result) {  
        progressDialog.dismiss();  
        if (result) {  
            Toast.makeText(context, "下載成功", Toast.LENGTH_SHORT).show();  
        } else {  
            Toast.makeText(context, "下載失敗", Toast.LENGTH_SHORT).show();  
        }  
    }  
}