从AsyncTask的实现可以看出,当我们第一次创建一个AsyncTask对象时,首先会执行下面静态初始化代码创建一个线程池sExecutor:
        
  1. privatestaticfinalBlockingQueue<Runnable>sWorkQueue=
  2. newLinkedBlockingQueue<Runnable>(10);
  3. privatestaticfinalThreadFactorysThreadFactory=newThreadFactory(){
  4. privatefinalAtomicIntegermCount=newAtomicInteger(1);
  5. publicThreadnewThread(Runnabler){
  6. returnnewThread(r,"AsyncTask#"+mCount.getAndIncrement());
  7. }
  8. };
  9. ......
  10. privatestaticfinalThreadPoolExecutorsExecutor=newThreadPoolExecutor(CORE_POOL_SIZE,
  11. MAXIMUM_POOL_SIZE,KEEP_ALIVE,TimeUnit.SECONDS,sWorkQueue,sThreadFactory);
这里的ThreadPoolExecutor是Java提供的多线程机制之一,这里用的构造函数原型为:
        
  1. ThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,
  2. BlockingQueue<Runnable>workQueue,ThreadFactorythreadFactory)
各个参数的意义如下: corePoolSize -- 线程池的核心线程数量 maximumPoolSize -- 线程池的最大线程数量 keepAliveTime -- 若线程池的线程数数量大于核心线程数量,那么空闲时间超过keepAliveTime的线程将被回收 unit -- 参数keepAliveTime使用的时间单位 workerQueue -- 工作任务队列 threadFactory -- 用来创建线程池中的线程
简单来说,ThreadPoolExecutor的运行机制是这样的:每一个工作任务用一个Runnable对象来表示,当我们要把一个工作任务交给这个线程池来执行的时候,就通过调用ThreadPoolExecutor的execute函数来把这个工作任务加入到线程池中去。此时,如果线程池中的线程数量小于corePoolSize,那么就会调用threadFactory接口来创建一个新的线程并且加入到线程池中去,再执行这个工作任务;如果线程池中的线程数量等于corePoolSize,但是工作任务队列workerQueue未满,则把这个工作任务加入到工作任务队列中去等待执行;如果线程池中的线程数量大于corePoolSize,但是小于maximumPoolSize,并且工作任务队列workerQueue已经满了,那么就会调用threadFactory接口来创建一个新的线程并且加入到线程池中去,再执行这个工作任务;如果线程池中的线程量已经等于maximumPoolSize了,并且工作任务队列workerQueue也已经满了,这个工作任务就被拒绝执行了。
创建好了线程池后,再创建一个消息处理器:
        
  1. privatestaticfinalInternalHandlersHandler=newInternalHandler();
注意,这行代码是在应用程序的主线程中执行的,因此,这个消息处理器sHandler内部引用的消息循环对象looper是应用程序主线程的消息循环对象,消息处理器的实现机制具体可以参考前面一篇文章 Android应用程序消息处理机制(Looper、Handler)分析 AsyncTask类的静态初始化代码执行完成之后,才开始创建AsyncTask对象,即执行AsyncTask类的构造函数:
        
  1. publicAsyncTask(){
  2. mWorker=newWorkerRunnable<Params,Result>(){
  3. publicResultcall()throwsException{
  4. ......
  5. returndoInBackground(mParams);
  6. }
  7. };
  8. mFuture=newFutureTask<Result>(mWorker){
  9. @Override
  10. protectedvoiddone(){
  11. Messagemessage;
  12. Resultresult=null;
  13. try{
  14. result=get();
  15. }catch(InterruptedExceptione){
  16. android.util.Log.w(LOG_TAG,e);
  17. }catch(ExecutionExceptione){
  18. thrownewRuntimeException("AnerroroccuredwhileexecutingdoInBackground()",
  19. e.getCause());
  20. }catch(CancellationExceptione){
  21. message=sHandler.obtainMessage(MESSAGE_POST_CANCEL,
  22. newAsyncTaskResult<Result>(AsyncTask.this,(Result[])null));
  23. message.sendToTarget();
  24. return;
  25. }catch(Throwablet){
  26. thrownewRuntimeException("Anerroroccuredwhileexecuting"
  27. +"doInBackground()",t);
  28. }
  29. message=sHandler.obtainMessage(MESSAGE_POST_RESULT,
  30. newAsyncTaskResult<Result>(AsyncTask.this,result));
  31. message.sendToTarget();
  32. }
  33. };
  34. }
在AsyncTask类的构造函数里面,主要是创建了两个对象,分别是一个WorkerRunnable对象mWorker和一个FutureTask对象mFuture。 WorkerRunnable类实现了Runnable接口,此外,它的内部成员变量mParams用于保存从AsyncTask对象的execute函数传进来的参数列表:
        
  1. privatestaticabstractclassWorkerRunnable<Params,Result>implementsCallable<Result>{
  2. Params[]mParams;
  3. }
FutureTask类也实现了Runnable接口,所以它可以作为一个工作任务通过调用AsyncTask类的execute函数添加到sExecuto线程池中去:
        
  1. publicfinalAsyncTask<Params,Progress,Result>execute(Params...params){
  2. ......
  3. mWorker.mParams=params;
  4. sExecutor.execute(mFuture);
  5. returnthis;
  6. }
这里的FutureTask对象mFuture是用来封装前面的WorkerRunnable对象mWorker。当mFuture加入到线程池中执行时,它调用的是mWorker对象的call函数:
        
  1. mWorker=newWorkerRunnable<Params,Result>(){
  2. publicResultcall()throwsException{
  3. ......
  4. returndoInBackground(mParams);
  5. }
  6. };
在call函数里面,会调用AsyncTask类的doInBackground函数来执行真正的任务,这个函数是要由AsyncTask的子类来实现的,注意,这个函数是在应用程序的子线程中执行的,它不可以操作应用程序的界面。

更多相关文章

  1. Android(安卓)面试复习资料
  2. Android知识点总结(二十)Android中的ANR
  3. Android(安卓)3D系列之基本概念篇
  4. EventBus3.0源码解析(二):post()与postSticky()
  5. Android(安卓)framework analysis
  6. android 数据库 sqlite数据类型
  7. Android(安卓)camera系统开发之IPC (二)
  8. Android(安卓)Netroid解析之——断点续传下载及问题修正
  9. android AsyncQueryHandler的分析

随机推荐

  1. 从四个视角理解Activity的启动模式
  2. 2020-12-24
  3. 自定义Android注解Part1:注解变量
  4. 三星败诉,Android必将迎来新一轮洗牌
  5. Emulator: PANIC: Cannot find AVD syste
  6. OpenGL ES for Android 播放视频
  7. Gradle(一)基本概念
  8. Android 手机屏幕那些事儿
  9. Android跟蓝牙耳机建立连接有两种方式
  10. Android:媒体播放器