AsyncTask源碼解析

上週在做項目過程中,發現使用了較多的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 下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章