一般情況下在android中使用多線程的時候,我們都是在線程運行的時候使用Handler來給主線程傳遞消息,這樣用起來雖然沒什麼不好,但是總感覺有點亂。其實Android已經提供了一個標準的實現多線程的模型,那就是AsyncTask類。
這個類用起來很簡單,繼承他之後,override幾個方法,然後就可以在線程執行過程中,不斷的將結果通知給ui線程。
下面簡單講一下用法,看代碼:
- package cn.infogiga.starter;
- import android.os.AsyncTask;
- import android.util.Log;
- /**
- * @author chroya
- *
- */
- public class MyThreads extends AsyncTask<Integer, Integer, Integer>{
- @Override
- protected Integer doInBackground(Integer... params) {
- 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);
- }
- }
- //返回總數
- return p;
- }
- @Override
- protected void onProgressUpdate(Integer... progress) {
- Log.d("onProgressUpdate" , "progress:" + progress[ 0 ]);
- }
- @Override
- protected void onPostExecute(Integer result) {
- Log.d("onPostExecute" , "result:" + result);
- }
- }
MyThreads繼承了AsyncTask,他有三個泛型參數,第一個是任務執行所需要的參數類型,第二個是任務的進度表示類型,第三個是進度計算的結果類型。
我override了三個方法:
doInBackground:就是任務執行的主方法,它會被作爲一個線程運行。
onProgressUpdate:進度更新的時候調用,進度什麼時候更新呢?就是調用了publishProgress方法之後就更新。
onPostExecute:在doInBackground執行並返回之後調用,因爲他需要doInBackground的返回值做參數。
怎麼使用它呢?
- new MyThreads().execute( 10 , 20 , 30 );
沒錯,就這一句。
這一句傳遞了三個參數進去,傳遞給了 doInBackground,然後線程開始運行,將三個數開始逐一計數,雖然計數不用這麼麻煩,但是爲了弄明白AsyncTask的運行機制,複雜點反而好。
結果打印出 onProgressUpdate的 1到60,最後打印出了 onPostExecute的result:60.