AsyncTask詳解

請你講解一下handler和AsyncTask的原理,android面試時必問問題。
今天我們來說說異步任務,爲嘛,裏面有些方法在主線程,有些方法在子線程,這種怎麼做到的嘞?爲嘛AsyncTask不能在子線程中創建執行?爲什麼執行過一次後就不能在執行。
首先我們來看構造函數
這裏寫圖片描述
首先構造裏面new了一個WorkerRunnable,這是一個什麼鬼?它是個Runnable嗎?
這裏寫圖片描述
我看到他的聲明,這是AsynscTask裏面的一個靜態抽象內部類 實現了Callable接口,這個Callable 是什麼呢?
這裏寫圖片描述
看一下文檔,原來這是一個類似於Runnable 的東西(>The {@code Callable} interface is similar to {@link * java.lang.Runnable})
這個也是用來設計被一個線程調用的,這個call方法就和run方法一樣,執行後還會返回結果。
我們在回去看構造裏面定義的WorkerRunnable,見到在裏面看到我們一個熟悉的方法doInBackground(mParams)
原來就在這裏這個子線程去處理doInBackground方法
我們看完構造,在來看execute方法
這裏寫圖片描述
結果發現它調用的另外一個方法
這裏寫圖片描述

我們可以看到,當狀態是執行狀態或者結束了,它就拋異常,不讓繼續執行了。繼續往下走開啓線程池的線程,並把狀態設置成運行,假如要AsynscTask在子線程執行,那onPreExecute方法就在子線程中處理了,不能去顯示對話框了。
開始執行子線程。
子線程執行,線程處理完成在做啥嘞,我們繼續看構造方法裏面
這裏寫圖片描述

從前面的線程裏面拿到結果 Result,然後處理。
這裏寫圖片描述

這時我們看到一個熟悉的東西,Message,把結果發送給Handler
這裏寫圖片描述
這時看handler
這裏寫圖片描述

一個靜態的內部類InternalHandler,設置Loop爲Looper.getMainLooper() 讓主線程去處理看消息處理的地方,看到個熟悉的東西finish方法和onProgressUpdate方法。
咦onPostExecute方法哪裏去了
這裏寫圖片描述
在這裏,在finish方法裏面。
這裏面有個用handler 用的比較帥的方法,
這裏寫圖片描述
他把AsyncTask 和子線程結果一起作爲消息發送給了handler ,然後在handler的handleMessage方法調用來保證onProgressUpdate,onPostExecute,onCancelled等方法在子線程中執行
知識有限,有錯漏出請見諒,希望能指出改正。

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