【Android框架進階〖02〗】ThinkAndroid線程池機制

/**************************************************************************************************java

 *  本博客爲CSDN博主【MK】原創,博客地址:http://blog.csdn.net/mkrcpp/article/details/14166627框架

 **********************************************************************************************************************/異步

TAApplicationThinkAndroid的靈魂,整個框架的初始化工做都在這裏進行了。this

其中有一個重要的工做,即初始化線程池機制 ,英文名爲TACommandExecutorspa

之因此稱爲機制,是由於這不單單是一個線程池。.net

經過觀察代碼能夠看出,最最重要的代碼是線程

  1. public void ensureInitialized()  
    {  
        if (!initialized)  
        {  
            initialized = true;  
            TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");  
            TACommandQueueManager.getInstance().initialize();  
            TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");  
        }  
    }


其中涉及到一個很重要的類,即 TACommandQueueManager,看名字就知道這是一個隊列管理器 。code

好,接下來咱們就研究下TACommandQueueManagerblog

很是清晰的,咱們看到連個重要的屬性,TAThreadPoolTACommandQueue,隊列

看名字就知道一個是線程池,一個是指令隊列。而後 TACommandQueueManager的做用就是初始化線程池和初始化隊列。

經過研究線程池 TAThreadPool 的代碼能夠知道,默認僅僅是建立了2個線程,而且在系統啓動時運行起來。

經過研究指令隊列TACommandQueue的代碼能夠知道它維護了一個LinkedBlockingQueue,一個阻塞隊列,由鏈表實現。

阻塞隊列的好處就是:

  • 當一個線程A申請從隊列中取數據時,若是隊列中沒有數據,那麼線程A就發生阻塞,直到隊列中存在數據。

  • 一樣的,當線程B想向隊列中存放數據時,若是隊列已滿,那麼線程B阻塞,直到隊列中被取走了一個值,這就是我們熟悉的生產者消費者模式嘛。

OK,說了這麼多,稍微整理下

  1. ------------------------------------  

  2. TACommandQueueManager   初始化了    一個阻塞隊列和一個線程池,線程池不斷的從隊列中取指令並執行  

  3. TACommandExecutor       初始化了    TACommandQueueManager   

  4. TAApplication           初始化了    TACommandExecutor  

  5. ------------------------------------  

基本上搞清楚了,惟一不清楚的就是什麼是Command,阻塞隊列維護的是什麼樣的指令呢,線程池執行的究竟是什麼呢?

咱們來分析下

  1. TAICommand:           
        -getRequest()得到請求數據  
        -setRequest(TARequest request)設置請求數據  
        -getResponse()得到返回數據  
        -setResponse(TAResponse response)設置趕回數據  
        -execute()  
        -getResponseListener()得到響應/返回監聽器  
        -setResponseListener(TAIResponseListener listener)設置響應/返回監聽器  
        -setTerminated(boolean terminated)設置是否終結/中止  
        -isTerminated()判斷狀態是否中止
  2. ----------------------------------------------------------------------------  
      
            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

 **********************************************************************************************************************/

相關文章
相關標籤/搜索