/**************************************************************************************************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
**********************************************************************************************************************/