設計模式---模板設計模式之AsyncTask源碼解讀

(圖文無關,方便各位老鐵看時視覺緩沖)

在所有開始之前,先和大家介紹一下23種設計模式中的模板設計模式

首先,什么是設計模式?我們?yōu)槭裁匆褂迷O計模式,這里給設計模式正個名,

網上有些哥們對設計模式還是有點偏見的----可以自己敲干嘛用什么設計模式?畫蛇添足,思維固化嗎?

我的看法是:這是每個人的編碼習慣而造成的偏見,所以,你是沒辦法說設計模式對每個人

都是合適的,看個人!你可以因為設計模式的好而去使用它


接下來我就說說設計模式好在哪里,畢竟這些設計模式是經過老一代程序員前輩的手而流傳下來的,

里面總有一些東西值得我們去學習和借鑒。當然你也可以自己去設計一些模式,這并不影響。

好,不多說。下面我們來看看什么是設計模式,他們好在哪里。

設計模式的概念:

設計模式(Design Pattern)是一套被反復使用、多數(shù)人知曉的、經過分類的、代碼設計經驗的總結。

使用設計模式的目的:為了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。 設計模式使代碼編寫真正工程化;設計模式是軟件工程的基石脈絡,如同大廈的結構一樣。

以上是百度百科出來的答案。我們看這個的時候抓住他們的關鍵詞,就是上面我用字體加粗部分,可重用性:這個避免了代碼的冗余

減少了內存的消耗(當然其實這個病不會消耗我們多少內存,但是如果每次我都要重新去寫一份一樣的程序的話,我第一反應就是怎么只用一次

才不至于寫些冗余的程序,這個非常符合我們寫程序時追求的簡單,高效原則),容易被他人理解:設計模式是相當有條有理的,相比于一些代

碼這里一堆哪里一坨的,你覺得那個更好理解一點?可靠性:容易產生的bug不多,當然這是在你按照他的模式去寫。工程化:這里我個人覺得是

強調的是這個程序系統(tǒng)的有序,思維清晰,邏輯嚴謹。當然也是相對一些比較雜的程序而言的,當一個團隊去做一個項目是,你想,如果這里做

一點哪里做一點,或者說一個類,這個人要加點權限,那個人又要加點權限。不就呵呵了嗎?(如果你用代理模式來代理過been類就有些體會了)



()

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(壁紙:上帝之眼的星空現(xiàn)象,雙屏顯示賊6,)

好,到這里我就不說設計模式有多好了,直接去講我們今天的主題---模板設計模式解讀AsyncTask這個類。



AsyncTask task = new AsyncTask(){

? ? ? ? ? ? @Override

? ? ? ? ? ? protected void onPostExecute(Void aVoid) {

? ? ? ? ? ? ? ? super.onPostExecute(aVoid);

? ? ? ? ? ? ? ? // 執(zhí)行完成返回的方法 , UI 主線程

? ? ? ? ? ? }

? ? ? ? ? ? @Override

? ? ? ? ? ? protected Void doInBackground(Void... params) {

? ? ? ? ? ? ? ? // 執(zhí)行一些耗時的操作? 連接網絡獲取數(shù)據(jù),讀取大型數(shù)據(jù)庫? 運行在Thread中

? ? ? ? ? ? ? ? return null;

? ? ? ? ? ? }

? ? ? ? ? ? @Override

? ? ? ? ? ? protected void onPreExecute() {

? ? ? ? ? ? ? ? // 一調用就會執(zhí)行的方法 UI 主線程

? ? ? ? ? ? ? ? super.onPreExecute();

? ? ? ? ? ? }

? ? ? ? };

? ? ? ? // RXJava? 模板的設計模式? 非常符合

? ? ? ? task.execute();


我詳細學過安卓的對這個類不會很陌生,異步加載類(常用類)

我們點擊進去這個類,可以看到這個類是“長“這個樣子的,關鍵看什么呢?


先把目光放在這個方法上面,從這上面可以理解為什么這個類他是只執(zhí)行一次了吧!!不理解的可以多看幾次。

這里我們可以看出AsyncTask 一開始就會調用 onPreExecute這個方法

然后執(zhí)行FutureTask(Runnable)執(zhí)行run方法 然后最終會調用 執(zhí)行在線程中


觀察一下,doInBackground(mParams);是運行在線程中的

然后繼續(xù)看另外一個方法,就是如何把已經開啟了的線程切換到主線程中(這里我想很多人都已經有點感覺到了:

headler消息發(fā)送機制),沒錯--->





postResult 在線程中通過Handler的消息機制發(fā)一個消息讓其切換到主線程中,然后執(zhí)行onPostExecute()方法。(如果還不明白為什么只執(zhí)行一次的,看到這里估計也明白了,mStatus值得變化結合上的)

finish會去判斷有沒有取消,如果是取消了就會調用onCancelled()方法,否則就是onPostExecute() 執(zhí)行在主線程中了,最后把狀態(tài)置為FINISHED。

到這里大概所有的過程都已經說的差不多了,如果想更好的了解,我的建議是:你最好實踐一波。起碼把我說的這些東西找到。


總結:ececute()方法一調用就會去判斷狀態(tài),如果狀態(tài)不對就會拋異常,然后會把狀態(tài)置為Running ,然后執(zhí)行onPreExecute(), 開一個線程執(zhí)行 doInBackground(),

? ? ? ? doInBackground()執(zhí)行完畢之后會利用Handler發(fā)送消息切換主線程中,然后執(zhí)行onPostExecute()方法,最后把狀態(tài)置為FINISHED。


我在源碼閱讀這方面也算個新手,如果有那位眼光高的兄弟看到了,就請多指教了哈!



最后,現(xiàn)在我的時間是22:45,祝你晚安,陌生人!


?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容