asynctask 內部實現原理主要是兩個執行緒池和乙個handler。
兩個執行緒池分別為serialexecutor和threadpoolexecutor。
其中serialexecutor是維護乙個有序佇列;threadpoolexecutor是執行任務的執行緒池。
handler是internalhandler 執行非同步操作的。
1.首先我們先來看下asynctask 的構造方法。
public
asynctask
(@nullable looper callbacklooper)
catch
(throwable tr)
finally
return result;}}
; mfuture =
newfuturetask
(mworker)
catch
(interruptedexception e)
catch
(executionexception e)
catch
(cancellationexception e)}}
;}
從構造方法中我們可以看出 初始化了乙個handler,以及初始化workerrunnable並實現了call()方法,還有初始化futuretask並實現done()方法。
我們接著往下看
workerrunnable實際是乙個callable
private
static
abstract
class
workerrunnable
implements
callable
futuretask是runnable和future的子類
public
class
futuretask
implements
runnablefuture
public
inte***ce
runnablefuture
extends
runnable
, future
構造方法介紹完畢我們看下execute();的執行方法
@mainthread
public
final asynctask
execute
(params.
.. params)
@mainthread
public
final asynctask
executeonexecutor
(executor exec,
params.
.. params)
}// 將asynctask狀態設定為running狀態
mstatus = status.running;
// 主線程初始化工作
onpreexecute()
;// 新增引數到任務中
mworker.mparams = params;
// 執行任務
// 此處的exec = sdefaultexecutor = 任務佇列 執行緒池類(serialexecutor)的物件
exec.
execute
(mfuture)
;return
this
;}
可以看到實際上是sdefaultexecutor執行了execute方法,那我們看下sdefaultexecutor實際是乙個serialexecutor執行緒池的物件
private
static
volatile executor sdefaultexecutor = serial_executor;
public
static
final executor serial_executor =
newserialexecutor()
;
那麼我們看下serialexecutor
private
static
class
serialexecutor
implements
executor
finally}}
);// 若當前無任務執行,則去佇列中取出1個執行
if(mactive == null)
}protected
synchronized
void
schedulenext()
}}
這裡面的runnable其實就是我們傳入的futuretask物件
這裡首先是先將乙個個新任務加入佇列然後schedulenext方法從佇列的頭部取出任務乙個個的執行。
執行任務的時候呼叫了futuretask的run方法實際上就呼叫了mworker的call()方法
public
class
futuretask
implements
runnablefuture
public
void
run(
)catch
(throwable ex)
if(ran)
set(result);}
}finally
}
這裡的call物件實際就是在構造方法中傳入的mworker物件。
接著我們看下call()的實現方法就在構造方法中
mworker =
newworkerrunnable
()catch
(throwable tr)
finally
return result;}}
;
可以看到這裡執行了doinbackground 耗時任務 執行完把結果發給postresult
doinbackground 就是我們需要執行非同步任務的地方
這裡給出了呼叫的demo
asynctask asynctask =
newasynctask()
@override
protected
void
onpostexecute
(object o)};
asynctask.
execute()
;
分析postresult(result)
private result postresult
(result result)
這裡的gethandler實際就是internalhandler
postresult方法給internalhandler 傳送了乙個message message_post_result和乙個 asynctaskresult
private
static
class
internalhandler
extends
handler
@suppresswarnings()
@override
public
void
handlemessage
(message msg)
}}
result.mtask實際就是asynctask自己
private
static
class
asynctaskresult
}
internalhandler 接受到message_post_result執行asynctask的finish方法
private
void
finish
(result result)
else
mstatus = status.finished;
}
這裡就執行了我們實現的oncancelled或onpostexecute
總結1.任務執行緒池類(thread_pool_executor)實際上是1個已配置好的可執行並行任務的執行緒池
2.呼叫thread_pool_executor.execute()實際上是呼叫執行緒池的execute()去執行具體耗時任務
3.而該耗時任務則是步驟2中初始化 workerrunnable例項物件時複寫的call()內容
4.在call()方法裡,先呼叫 我們複寫的doinbackground(mparams)執行耗時操作
5.再呼叫postresult(result), 通過 internalhandler 類 將任務訊息傳遞到主線程;根據訊息標識(message_post_result)判斷,最終通過finish()呼叫我們複寫的onpostexecute(result),從而實現ui更新操作
AsyncTask原始碼分析
就從asynctask的構造方法開始分析 creates a new asynchronous task.this constructor must be invoked on the ui thread.public asynctask mfuture new futuretask mworker...
7 0 AsyncTask原始碼分析
之前開發中經常使用asynctask進行非同步資料獲取,當時只限於使用,只知道大體的就是通過執行緒池 handler實現的封裝,具體的 細節沒有仔細看過,今天就閱讀一下原始碼,當作筆記。加深記憶 public asynctask mfuture new futuretask mworker catc...
AsyncTask非同步任務機制原始碼分析
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...