AsyncTask工作原理複習總結

上週閒來無事就去某些大公司面試了一下,試試現在android這塊的水!總結出結論就是,稍大點的公司問的基礎的東西還是比較的多,而規模較小的公司則是更注重模塊功能點的實現!所以呢,你未來職業的發展得有個大體的規劃,大公司呢,就多注意一下基礎知識和整體框架的把握,而規模稍小的公司則需要你將某些功能塊挖的深一些!這是我個人的感覺,哈哈!僅供參考!

進入正題!

AsyncTask已經出來太久了,以至於我們可以很熟悉的用它!那它是怎麼工作的呢?之前在學習android的時候,看過它的源碼實現!但是實在太久了,差不多都忘光了!今天早上手上的事情做完後無聊,就又走了一遍,突然感覺看別人的源碼比自己擼代碼還要舒服!

這裏寫圖片描述

我們先從實例化AsyncTask開始逐步瞭解!

這裏寫圖片描述

OK,我們聊一下這張圖!從WorkerRunnable中我們看到了AsyncTask的一個重要方法doInBackfround()是在這個方法中執行的!然後再將WorkerRunnable的引用添加到了FutureTask中執行結果回調。所以說基本可以確定這是在子線程中的,當然還有一行代碼可以證明:

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

這行代碼什麼意思呢?

這裏寫圖片描述

標準後臺線程。這讓你的線程低於正常的優先級,這樣會保證用戶界面的響應性。

OK,看到這即可了!我們不能盲目的鑽到理解代碼的詳細細節上,不然就出不去了!

AsyncTask實例化完了,我們就改看看他是怎麼執行的吧!執行的話,我們通常會調用它的execute()方法。

這裏寫圖片描述

嗯,知識簡單的執行了一個函數,並傳入了兩個參數!sDefaultExecutor和params,第二個參數,不用說了,就是我們自己傳入的參數,第一個呢?

這裏寫圖片描述

嗯,它是SerialExecutor的實例化對象,實現了Executor,重要的是下面這行代碼:

final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();

SerialExecutor通過ArrayDeque控制管理線程池中的Runnable對象,其原理是隊列,先進先出形式!

看看它提供的offer方法:

這裏寫圖片描述

很簡單的翻譯吧!在隊未添加一個Runnable元素。

再看poll方法:
這裏寫圖片描述

取出並移除頂部元素

嗯,大概明白了!SerialExecutor是一個線程池,它通過ArrayDeque來控制線程Runnable的執行順序!也就是說SerialExecutor是一個排隊的線程池!

接着說executeOnExecutor(),它將SerialExecutor和params(我們自己設置的參數)傳過去了!

這裏寫圖片描述

哈哈,是不是看到了執行流程了?

Pending(等待)–>Running(運行)–>Finished(結束)

如果非等待狀態,那就不好意思了!拋出了異常!
如果是等待狀態則執行:

mStatus更改爲RUNNING狀態;
onPreExecute();執行之前預備狀態
mWorker.mParams = params;設置傳過來的參數
exec.execute(mFuture);開始執行

exec則是我們傳過來的SerialExecutor,而mFuture則是我們在實例化的時候生成的子線容器!

回過頭再看SerialExecutor

這裏寫圖片描述

在執行 r.run()後,我們怎麼獲得執行的結果呢?

這裏寫圖片描述

FutureTask執行完成後必會調用

protected void done() 

那就會執行postResultIfNotInvoked(get());

接着
這裏寫圖片描述

再接着實例化Handler;

這裏寫圖片描述

Handler發送消息進行處理:

這裏寫圖片描述

這個主意的是,在super(Looper.getMainLooper());執行後,又回到到了主線程!而在執行finish方法的時候,調用了onPostExecute(result);使得結果得到了回調成功!

這裏寫圖片描述

OK,執行流程大概就是這麼個樣子!

總結:
總的來說AsyncTask的內部封裝了SERIAL_EXECUTOR(排隊線程池),THREAD_POOL_EXECUTOR(執行線程池),以WorkerRunnable爲子線程封裝可回調控制操作的FutureTask子線程,以及用於更新界面的一個內部InternalHandler,這麼一個結構,理解起來並不是很難!關鍵是人家的這種設計和一些api的合理使用!

閒話少說,年關了,估計大夥都蠢蠢欲動!加油吧!

每天進步一點點,時間會讓你成爲巨人!

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