Android 子執行緒UI更新操作之二------AsyncTask
阿新 • • 發佈:2018-12-16
為了更方便的對子執行緒的中的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(); } } }