在物件導向開發過程中,通常會遇到這樣的乙個問題,我們知道乙個演算法所需的關鍵步驟,並確定了這些步驟的執行順序,但是某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨著環境的變化而改變的。
例如,執行程式的流程大致如下:
檢查**的正確性
鏈結相關的類庫
編譯相關**
執行程式
對於不同的程式語言,上述 4 個步驟都是不一樣的,但是它們的執行流程都是固定的,這類問題的解決方案就是模板方法模式。
定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
在 android 中,asynctask 是乙個比較常用的型別,這個類就使用了模板方法模式。
asynctask 的整個執行過程其實是乙個框架,具體的實現都需要子類來完成,而且它執行的演算法框架是固定的,呼叫 execute 後會依次執行 onpreexecute、doinbackground、onpostexecute,當然也可以通過 onprogressupdate 來更新進度。
asynctask 的 execute 方法如下:
@mainthread
public
final asynctask
execute
(params.
.. params)
executeonexecutor 方法如下:
@mainthread
public
final asynctask
executeonexecutor
(executor exec,
params.
.. params)
} mstatus = status.running;
onpreexecute()
; mworker.mparams = params;
exec.
execute
(mfuture)
;return
this
;}
可以看到 execute 方法是乙個 final 方法,它呼叫了 executeonexecutor 方法。如果不是 pending 狀態會丟擲依次,這也解釋了為什麼 asynctask 只能被執行一次,因為 asynctask 的 running 和 finished 狀態都會丟擲異常,因此每次使用 asynctask 時都需要重新建立乙個物件。
mworker 只是實現了 callable 介面,並新增了乙個引數陣列字段。
public
asynctask
(@nullable looper callbacklooper)
catch
(throwable tr)
finally
return result;}}
; mfuture =
newfuturetask
(mworker)
catch
(interruptedexception e)
catch
(executionexception e)
catch
(cancellationexception e)}}
;}
mworker 的 call 方法會呼叫 doinbackground,並且在 finally 方法裡面將 result 通過 postresult 方法傳遞出去。
mfuture 包裝了 mworker 物件,在這個 mfuture 物件的 run 函式中又會呼叫 mworker 物件的 call 方法,在 call 方法中呼叫了 doinbackground 函式。因為 mfuture 提交給了執行緒池來執行,所以使得 doinbackground 執行在非 ui 執行緒。得到 doinbackground 的結果後,通過 postresult 傳遞結果給 ui 執行緒。
postresult 方法如下:
private result postresult
(result result)
postresult 方法把乙個訊息(message_post_result)傳送給 handler 執行。handler 是 internalhandler 型別。
private
static
class
internalhandler
extends
handler
@suppresswarnings()
@override
public
void
handlemessage
(message msg)
}}
當 internalhandler 接到 message_post_result 型別的訊息時,就會呼叫 result.mtask.finish() 方法。
finish 方法如下:
private
void
finish
(result result)
else
mstatus = status.finished;
}
asynctask 的 finish 方法又呼叫了 onpostexecute ,這個時候執行過程就完成了。
總之,execute 方法內部封裝了 onpreexecute、doinbackground、onpostexecute 這個邏輯流程,使用者可以根據自己的需求再覆寫這幾個方法,使得使用者可以很方便地使用非同步任務來完成耗時地操作以及更新ui,這其實就是通過執行緒池來執行耗時地任務,得到結果之後,通過 handler 將結果傳遞到 ui 執行緒來執行。
《Android原始碼設計模式》 模板方法模式
no1 模板方法模式包括 抽象類 其中定義了一系列順序方法 具體實現類a 具體實現類b 如果子類有實現不一樣的細節,重寫父類的某個方法即可 no2 asynctask物件呼叫execute方法後會依次執行onpreexecute doinbackground onpostexecute或onprog...
Android原始碼獲取方法
android原始碼獲取方法。作為乙個android開發者,必要的時候閱讀以下原始碼可以拓寬一下自己的視野和對android的認知程度。google的android的原始碼管理倉庫是用的是git。android是乙個開源手機終端系統,基於linux核心的。我們在android source資料夾上右...
android原始碼獲取方法
git是linux torvalds為了幫助管理linux 核心開發而開發的乙個開放原始碼的分布式版本控制軟體,git這樣的分布式版本控制系統中,每乙個工作目錄都包含乙個完整倉庫,它們可以支援離線工作,本地提交可以稍後提交到伺服器上。因為android是由多個git專案組成,所以android專案編...