Android源碼設計模式-模板模式

模板模式

模板模式在Android源碼中出現的不少,好比Activity和Srervice的生命週期,啓動過程,還有AsyncTask類等。模板模式能夠理解爲一種算法流程的集合,能夠經過構造函數來靈活控制流程,實現抽象方法,來具體化細節。算法

使用

1.具備類似流程的算法,能夠考慮抽象出模板。 2.在重構過程當中,能夠把類似的子類抽象出一個模板父類,好比咱們Android的BaseActivity和BaseAdapter等抽象類。數據庫

官方定義

定義一個操做中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類能夠不改變算法的結構便可重定義該算法的某些特定步驟。架構

通俗點的理解就是 :完成一件事情,有固定的數個步驟,可是每一個步驟根據對象的不一樣,而實現細節不一樣;就能夠在父類中定義一個完成該事情的總方法,按照完成事件須要的步驟去調用其每一個步驟的實現方法。每一個步驟的具體實現,由子類完成。數據庫設計

結構

1.抽象父類 2.具體的子類函數

優缺點

模板模式的優勢

 (1)具體細節步驟實現定義在子類中,子類定義詳細處理算法是不會改變算法總體結構。post

 (2)代碼複用的基本技術,在數據庫設計中尤其重要。線程

 (3)存在一種反向的控制結構,經過一個父類調用其子類的操做,經過子類對父類進行擴展增長新的行爲,符合「開閉原則」。設計

缺點

每一個不一樣的實現都須要定義一個子類,會致使類的個數增長,系統更加龐大。cdn

在Android源碼中的使用

1.系統啓動過程,具體參考這篇博客: https://juejin.im/post/5b3885d96fb9a00e687a0708 2.組件生命週期,好比Activity和Service等 3.一些具體封裝類,好比AsyncTask等對象

舉例AsyncTask Android源碼

首先衆所周知,AsyncTask的模板就是那幾個抽象方法,等你去實現,咱們每次使用這個類,就是實現一個具體的子類,並且一個對象只能用一次,爲何呢?咱們下面一一解開

模板

1.onPreExecute() 2.doInBackground() 3.onProgressUpdate() 4.onPostExecute()

抽象父類的細節

首先介紹幾個角色: 1.ThreadPool:AsyncTask默認用線程池來切換線程,這個線程池在不通Android版本是不同的,最初始串行的,後來是並行,如今又是串行,是一個全局的線程池。

2.Handler:這個用於線程的消息交互,主要是子線程通知到UI線程,由於onPostEx'ecute()是在UI線程,因此咱們handler必須在U線程初始化。

爲何AsyncTask必須在UI線程初始化呢?

就是覺得內部的Handler必須是綁定UI線程的,而這個handler綁定的線程是也是在AsyncTask初始化的當前線程。

介紹模板調用細節

1.首先執行AsyncTask.Execute(Params)

這個方法會調用ExecuteOnExecutor(Executor,Params),會傳入默認的線程池:sDefaultExecutor和參數

2.ExecuteOnExecutor(Executor,Params)

這個方法會作如下幾件事: 1.開始判斷AsyncTask對象是否處於Running和Finish狀態,若是是就會彈出異常。而後設定這個AsyncTask對象處於running狀態。這也是爲何一個AsyncTask對象只能用一次。

2.調用onPreExecute()作一些初始化和準備。

3.調用doInBackground,初始化mWorker,並把Params賦值給mWorker的mParams成員。mWorker實現了Callable接口並在視線中調用了postResult(doInBackground(Params)),這個方法是關鍵,完成了線程切換,咱們後面展開講。

4.初始化mFuture,這是一個FutureTask對象,能夠理解爲一個Thread對象。

5.sDefaultExecutor.execute(mFuture),mFuture的run()方法會調用mWorker的call回調方法,最終調用postResult(doInBackground(Params))

postResult(doInBackground(Params))方法

以上是onPreExecute()和doInBackground()方法已經被調用了

postResult(doInBackground(Params))這個方法作了一下幾個事: 1.構造一個AsyncTaskResult,這個對象是兩個對象構造: AsyncTask對象實例 doInBackground執行完的Result

2.構造一個UI線程Handler的Message,what是MESSAGE_POST_RESULT,obj是AsyncTaskResult

3.發送給UI線程Handler處理。這個handler能處理兩類消息就是: MESSAGE_POST_RESULT:收到這個消息後切換到UI線程,取出obj裏面的AsyncTask對象實例調用finish()方法,finish方法會調用onPostExecute()犯法,而且把狀態標爲finish。 MESSAGE_POST_PROGRESS消息: 會調用AsyncTask對象實例的onUpdateProgress()方法

結束

模板模式在Android源碼架構層面也到處可見,若是你留意就會常常發現它的身影。

相關文章
相關標籤/搜索