Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> AsyncTask源碼分析

AsyncTask源碼分析

編輯:關於Android編程

前置內容:Callable、Future、FutureTask

\
\
\

Executor子類的execute方法接收一個Runnable作為參數,會在新線程中執行Runnable中的任務,ScheduledthreadPollExecutor也可以submit任務,參數可以是Runnable或者Callable。Callable可以理解為待返回值的Runnable。FutureTask繼承了Runnable和Future,既有Runnable功能也有Future功能。那麼Executor的execute方法就可以把FutureTask的實例作為參數去執行。

WorkerRunnable是一個抽象類,實現了Callable
\
\

mWorker是AsyncTask的一個變量,直接實例化的WorkerRunnable並復寫了Callable的call方法,call方法調用了doInBackground。重要的一點是mWorker是一個Callable對象,而FutureTask可以接收一個Callable對象的實例作為參數。
mFuture是AsyncTask的一個變量,同時是一個FutrueTask對象,接收一個Callable類型的對象作為參數,而mWorker就是一個Callable的一個實例,mFutrue就是將mWorker最為參數實例化的FutureTask的對象。mFuture復寫了done方法,done方法是任務執行完畢後的回調。get方法是獲得FutureTask的運行結果。done方法中調用postResultIfNotInvoked(get())就是將Future的運行結果作為參數調用postResultIfNotInvoked方法。
這樣doInBackground執行的結果就會在done方法的回調中作為參數傳給postResultIfNotInvoked方法。
\
postResultIfNotInvoked調用了postResult,postResult中調用了getHandler方法。
\
getHandler方法實例化了一個InternalHandler對象,是個單例。
\
再來看看InternalHandler,看它的構造,參數是Looper.getMainLooper(),和主線程綁定的Looper,那麼這個Handler發送的消息會被主線程處理(關於Handler的解析,以後會寫一篇關於這這方面的博客,這裡就不解釋Handler相關的東西了)。
再回去看postResult方法,它就是想handler發送了一個消息,Message的what是MESSAGE_POST_RESULT,就會進入InternalHandler的第一個分支。這裡又涉及到了一個內部類AsyncTaskResult,其實就是對Result和AsyncTask對象本身的封裝。
\
在InternalHandler的handlerMessage方法中調用了result(AsyncTaskResult)對象的mTask(AsyncTask自身)的finish方法。我們再去看finish方法:
\

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved