/**************************************************************************************************
* 本博客為CSDN博主【MK】原創,博客地址:http://blog.csdn.net/mkrcpp/article/details/14166627
**********************************************************************************************************************/
TAApplication是ThinkAndroid的靈魂,整個框架的初始化工作都在這裡進行了。
其中有一個重要的工作,即初始化線程池機制 ,英文名為TACommandExecutor。
之所以稱為機制,是因為這不僅僅是一個線程池。
通過觀察代碼可以看出,最最重要的代碼是
public void ensureInitialized()
{
if (!initialized)
{
initialized = true;
TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");
TACommandQueueManager.getInstance().initialize();
TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");
}
}
其中涉及到一個很重要的類,即 TACommandQueueManager,看名字就知道這是一個隊列管理器 。
好,接下來我們就研究下TACommandQueueManager,
非常清晰的,我們看到連個重要的屬性,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()執行的內容。