參考:
http://blog.csdn.net/lmj623565791/article/details/38614699
http://blog.csdn.net/singwhatiwanna/article/details/9272195
原理:
666
18行:設置當前AsyncTask的狀態為RUNNING,上面的switch也可以看出,每個異步任務在完成前只能執行一次。
20行:執行了onPreExecute(),當前依然在UI線程,所以我們可以在其中做一些準備工作。
22行:將我們傳入的參數賦值給了mWorker.mParams ,mWorker為一個Callable的子類,且在內部的call()方法中,調用了doInBackground(mParams),然后得到的返回值作為postResult的參數進行執行;postResult中通過sHandler發送消息,最終sHandler的handleMessage中完成onPostExecute的調用。
23行:exec.execute(mFuture),mFuture為真正的執行任務的單元,將mWorker進行封裝,然后由sDefaultExecutor交給線程池進行執行。
對比Handler+Thread
1、Handler+Thread
麻煩之處在于UI的更新牽涉較多,單個異步后臺顯得代碼過多,而且頻繁的new thread也不好。但是多個后臺比較清晰,可控性好。
2、AsyncTask
比較輕量級,單個后臺可用,系統封裝好的UI更新,但是不可太耗時(最多幾秒)。
但是由于版本的問題,1.6之前,3.0以后是隊列形式,中間版本是并發(最大支持128的并發,10個任務等待,即138個任務,超過則異常),但是也可強制開啟多線程執行executeOnExecutor()