上週在做項目過程中,發現使用了較多的Thread+Handler和AsyncTask的方式,這周抽空看了下AsyncTask
源碼(扣除各種註釋,源碼就剩三四百行非常簡短),瞭解了AsyncTask的整個運行機制,現在分享如下:
總體上來說AsyncTask
1、使用Executor執行Callable和FutureTask的線程方法運行異步代碼,並利用FutueTask的get()方法獲取Callable異步執行的返回值;
2、自定義了繼承Handler的InternalHandler 來發送兩種Message,一種是MESSAGE_POST_RESULT,用來通知主線程異步任務執行完畢,
另一種是MESSAGE_POST_PROGRESS 用來在異步代碼執行過程中將消息發給主線程。
詳細的分析,從我們代碼使用AsyncTask的步驟開始說起
1、最先使用AsyncTask,我們都要new一個AsyncTask對象,在AsyncTask的構造函數中,源碼進行了兩項操作
1.1生成abstract class WorkerRunnable<Params, Result> implements Callable<Result> 的實例對象
1.2將mWorker作爲構造函數的參數去實例化FutureTask
2、調用AsyncTask的execute方法
源碼中exeute的方法執行到最後其實就是把mFuture放到Exeutor執行,執行前設置狀態爲RUNNING並調用onPreExecute()後
調用mWorker的call()方法。
mWorker的call方法最終實質就是調用我們複寫的doInBackground(params)方法。
執行完doInBackground(params)後InternalHandler sHandler 向主線程發送消息通知異步代碼執行完成
result.mTask.finish(result.mData[0])方法會執行復寫onPostExecute方法並將狀態設置爲FINISH
3、在doInBackground方法中我們會使用publishProgress()向主線程發消息
這個方法的實質就是利用InternalHandler向主線程發送MESSAGE_POST_PROGRESS消息,InternalHandler
收到這個消息就會調用我們複寫的onProgressUpdate方法。
以上就是對AsyncTask源碼的分析。
AsyncTask源碼可以在http://download.csdn.net/my/uploads 或者http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/os/AsyncTask.java#AsyncTask 下載