/**************************************************************************************************java
* 本博客爲CSDN博主【MK】原創,博客地址:http://blog.csdn.net/mkrcpp/article/details/14166627框架
**********************************************************************************************************************/異步
TAApplication是ThinkAndroid的靈魂,整個框架的初始化工做都在這裏進行了。this
其中有一個重要的工做,即初始化線程池機制 ,英文名爲TACommandExecutor。spa
之因此稱爲機制,是由於這不單單是一個線程池。.net
經過觀察代碼能夠看出,最最重要的代碼是線程
public void ensureInitialized() { if (!initialized) { initialized = true; TALogger.i(TACommandExecutor.this, "CommandExecutor初始化"); TACommandQueueManager.getInstance().initialize(); TALogger.i(TACommandExecutor.this, "CommandExecutor初始化"); } }
其中涉及到一個很重要的類,即 TACommandQueueManager,看名字就知道這是一個隊列管理器 。code
好,接下來咱們就研究下TACommandQueueManager,blog
很是清晰的,咱們看到連個重要的屬性,TAThreadPool,TACommandQueue,隊列
看名字就知道一個是線程池,一個是指令隊列。而後 TACommandQueueManager的做用就是初始化線程池和初始化隊列。
經過研究線程池 TAThreadPool 的代碼能夠知道,默認僅僅是建立了2個線程,而且在系統啓動時運行起來。
經過研究指令隊列TACommandQueue的代碼能夠知道它維護了一個LinkedBlockingQueue,一個阻塞隊列,由鏈表實現。
阻塞隊列的好處就是:
當一個線程A申請從隊列中取數據時,若是隊列中沒有數據,那麼線程A就發生阻塞,直到隊列中存在數據。
一樣的,當線程B想向隊列中存放數據時,若是隊列已滿,那麼線程B阻塞,直到隊列中被取走了一個值,這就是我們熟悉的生產者消費者模式嘛。
OK,說了這麼多,稍微整理下
------------------------------------
TACommandQueueManager 初始化了 一個阻塞隊列和一個線程池,線程池不斷的從隊列中取指令並執行
TACommandExecutor 初始化了 TACommandQueueManager
TAApplication 初始化了 TACommandExecutor
------------------------------------
基本上搞清楚了,惟一不清楚的就是什麼是Command,阻塞隊列維護的是什麼樣的指令呢,線程池執行的究竟是什麼呢?
咱們來分析下
TAICommand: -getRequest()得到請求數據 -setRequest(TARequest request)設置請求數據 -getResponse()得到返回數據 -setResponse(TAResponse response)設置趕回數據 -execute() -getResponseListener()得到響應/返回監聽器 -setResponseListener(TAIResponseListener listener)設置響應/返回監聽器 -setTerminated(boolean terminated)設置是否終結/中止 -isTerminated()判斷狀態是否中止
---------------------------------------------------------------------------- TABaseCommand:基礎指令 *getRequest() *setRequest(TARequest request) *getResponse() *setResponse(TAResponse response) *getResponseListener() *setResponseListener(TAIResponseListener responseListener) *setTerminated(boolean terminated) *isTerminated() TARequest: 請求提交的數據 Tag 標記 Data 數據 activityKeyResID activityKey TAResponse:返回的數據,結果 Tag 標記 Data 數據 activityKeyResID activityKey TAIResponseListener: 數據返回的一個監聽器 onStart() onSuccess(TAResponse response) onRuning(TAResponse response) onFailure(TAResponse response) onFinish() ---------------------------------------------------------------------------- TACommand: TAIResponseListener private Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case command_start: listener.onStart(); break; case command_runting: listener.onRuning(getResponse()); break; case command_success: listener.onSuccess(getResponse()); break; case command_failure: listener.onFailure(getResponse()); break; case command_finish: listener.onFinish(); break; default: break; } }; }; *public final void execute() { onPreExecuteCommand(); //listener.onStart(); executeCommand(); //abstract onPostExecuteCommand(); //null } ---------------------------------------------------------------------------- TestMVCCommand 異步下載,發送信息通知 hanlder處理數據 *protected void executeCommand() { 處理耗時任務 sendSuccessMessage(arrayList); } ----------------------------------------------------------------------------
應用初始化時,初始化了線程池,和Command 阻塞隊列,那麼由此可知,上面的一系列代碼只是爲了實現統一管理 處理耗時任務的 線程,
再簡而言之,Command即相似於 AsynTask 中的 doInBackground()執行的內容。
/**************************************************************************************************
* 本博客爲CSDN博主【MK】原創,博客地址:http://blog.csdn.net/mkrcpp/article/details/14166627
**********************************************************************************************************************/