在Android開發中,為了方便我們在後臺線程中執行操作,然後將結果發送給主線程,從而在主線程中進行UI更新等操作,Anddroid開發框架提供了一個助手類AsyncTask,它對Thread和Handler進行了封裝,方便我們使用。 ...
概述
在Android開發中,為了方便我們在後臺線程中執行操作,然後將結果發送給主線程,從而在主線程中進行UI更新等操作,Anddroid開發框架提供了一個助手類AsyncTask,它對Thread和Handler進行了封裝,方便我們使用。
涉及知識點
AsyncTask提供了四個回調方法,分別在不同的時期進行調用,具體如下:
- onPreExecute() 任務執行之前的準備操作
- doInBackground(Void... params) 任務執行體
- nProgressUpdate(Integer... values) 任務執行過程中狀態更新
- onPostExecute(Void aVoid) 任務執行完畢操作
AsyncTask使用步驟
- 定義AsyncTask的子類,併在子類中實現回調函數
- 聲明子類對象,並調用execute()方法
示例功能圖
如下圖所示:
示例源代碼
定義AsyncTask的子類,併在子類中實現回調函數,源碼如下:
1 /** 2 * 自定義任務類 3 * Params:表示任務接收參數類型 4 * Progress:表示進度類型 5 * Result:返回值類型 6 * Void是關鍵字void的占位符類 7 */ 8 class MyTask extends AsyncTask<Void,Integer,Void>{ 9 10 /** 11 * 任務執行之前的準備工作 12 */ 13 @Override 14 protected void onPreExecute() { 15 Log.i(TAG, "onPreExecute: =========準備========="); 16 } 17 18 /** 19 * 任務執行 20 * @param params 21 * @return 22 */ 23 @Override 24 protected Void doInBackground(Void... params) { 25 Log.i(TAG, "doInBackground: =========正在執行========="); 26 for(int i=0;i<100;i++){ 27 publishProgress(i); 28 try { 29 Thread.sleep(500); 30 } catch (InterruptedException e) { 31 e.printStackTrace(); 32 } 33 } 34 return null; 35 } 36 37 /** 38 * 任務執行狀態更新 39 * @param values 40 */ 41 @Override 42 protected void onProgressUpdate(Integer... values) { 43 int percent=(values[0]+1); 44 mTextView.setText(String.valueOf(percent)); 45 mProgressBar.setProgress(percent); 46 } 47 48 /** 49 * 任務執行結束觸發事件 50 * @param aVoid 51 */ 52 @Override 53 protected void onPostExecute(Void aVoid) { 54 Log.i(TAG, "onPostExecute: =========執行完畢========="); 55 Toast.makeText(MainActivity.this,"任務執行完畢",Toast.LENGTH_SHORT).show(); 56 } 57 }
聲明子類對象,並調用execute()方法,源碼如下:
1 /** 2 * 點擊事件 3 * @param v 4 */ 5 public void bn_task_click(View v){ 6 //通過調用execute()方法,執行任務 7 Log.i(TAG, "bn_task_click: =========開始========="); 8 new MyTask().execute(); 9 }
調用日誌如下所示:
1 07-21 14:00:30.499 18439-18439/com.hex.demotask I/DemoTask: bn_task_click: =========開始========= 2 07-21 14:00:30.501 18439-18439/com.hex.demotask I/DemoTask: onPreExecute: =========準備========= 3 07-21 14:00:30.502 18439-18675/com.hex.demotask I/DemoTask: doInBackground: =========正在執行========= 4 07-21 14:01:20.674 18439-18439/com.hex.demotask I/DemoTask: onPostExecute: =========執行完畢=========
備註
一日一錢,千日千錢,繩鋸木斷,水滴石穿。