AsyncTask更新UI線程的基本原理

  1. 首先異步任務作的作多的用來更新UI,至於怎樣來跟UI線程進行交互的,咱們從源碼看起。當咱們new AsyncTask<Params, Progress, Result>.execute(),時,會執行AsyncTask的構造方法,而後執行execute()方法。咱們來看看構造方法:android

WorkerRunnable是一個抽象內部類,implements一個interface,call()方法是在接口中定義的。咱們須要注意的是它return的地方,postResult(doInBackground(mParams))。doInBackground(mParams),咱們太熟悉了,這裏面執行耗時操做,返回一個result做爲onPostExecute(Object result)的參數。咱們來看一下postResult()方法裏作了什麼異步

好吧,這裏面,咱們也很熟悉。這是message對消息進行封裝。sendToTarget()方法中有一行代碼,target.sendMesaage(this),毫無疑問,這個target就是Handler的實例。因此,call()方法中執行了doInBackground()方法,並經過handler發送了MESSAGE_POST_RESULT的消息。那接下來咱們看看handler接收消息作了什麼:post

從上面的代碼,能夠看出,Hander接收消息後,執行了onPostExecute()方法,這個方法咱們一樣很熟悉。構造方法咱們看到這,接下來咱們看看AsyncTask類中excute()方法中執行了哪些操做。this

execute()方法中執行了executeOnExecutor()方法,咱們來看看這個方法裏作了什麼。首先,狀態改成RUNNING,保證每一個AsyncTask實例只執行一次,android3.0之後默認採用單線程模式。oPreExecute()這個方法咱們也很熟悉,通常用來顯示進度條的。mWorker.mParams = params。mWorker是WorkerRunnable的實例。WorkerRunnable是一個抽象的內部類,實現Callable接口,定義了一個mParams變量。毫無疑問,爲call()方法中的doInBackground()方法的參數傳值。最後是,exec.execute(mFuture).線程

mTasks是個存放Runnable的隊列,scheduleNext()執行線程池中的線程。重點來看r.run(),r是執行excute()方法傳遞的參數,這個參數是mFuture,是FutureTask的實例。看看run()裏面作了什麼:對象

run()方法調用內部類Sync中的innerRun()方法,這個方法中咱們來看被標記的這行代碼。這裏callable是WorkerRunnable的對象,執行了WorkerRunnable繼承的接口Callable中的call()方法。咱們知道call()方法的返回值是postResult(doInBackground(mParams)),這個上面已經介紹過了。好了,彷佛一切線索都串聯起來了。繼承

簡單來總結一下,當咱們執行new AsyncTask(Params,Progress,Result).excute()時,AsyncTask的構造方法實現了Callable接口中的call()方法,而後excute()方法中執行了onPreExecute()方法,調用了call()方法,執行了doInBackGground()方法,返回值result被message封裝,而且對message的狀態設爲MESSAGE_POST_RESULT,經過handler發送出去。handlerMessage()接收到消息後,先對message的狀態值進行判斷,執行相應操做。這裏返回的是MESSAGE_POST_RESULT,對應的finish()方法中執行了onPostExecute()方法。咱們能夠在onPostExecute()方法中添加對UI的操做。接口

相關文章
相關標籤/搜索