从execute方法开始,内部调用executeOnExecutor方法
public final AsyncTask
return executeOnExecutor(sDefaultExecutor,parmas);
}
public final AsyncTask
mStautes = status.RUNNING;
onProExecute():
mWorker.parmas = parmas;
exec.execute(mFuture);
return this;
}
sDefaultExecutor是一个串行线程池,一个进程中所有的AsyncTask全部在这个线程池中排队执行。
public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
public static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR ;
private static class SerialExecutor implements Executor{
final ArrayDeque
Runnable mActive;
public synchronized void execute(final Runnable r){
mTasks.offer(new Runnable(){
public void run(){
try{ r.run();}finally{ ScheduleNext();}
}
}
protect synchronized void ScheduleNext(){
if((mActive = mTasks.poll())!=null)
THREAD_POOL_EXECUTOR.execute(mActive):
}
}
系统会把AsyncTask的Params参数封装成FutureTask对象,FutureTask是一个并发类,这里充当了Runnable作用,接着futureTask交给SerialExecutor的execute处理,将其插入mTask队列,如果没有正在活动的AsyncTask任务,那么调用ScheduleNext执行下一个任务。
AsyncTask有两个线程池和一个Handler,SerialExecutor用于任务排队,而THREAD_POOL_EXECUTOR真正执行任务,InternalHandler用于从线程池切换到主线程。
继承了Thread,在run方法中通过Looper.prepare()创建消息队列,并通过Looper.loop开启消息循环。
继承了Service并且是一个抽象类,必须创建子类才能使用IntentService。
用于执行后台耗时任务,执行完毕自动停止,由于是服务的原因,优先级高于线程,适用于高优先级后台任务。
内部封装了HandlerThread和Handler。
当IntentService第一次启动,onCreate方法创建一个HandlerThread,再使用它的Looper创建一个Handler对象mServiceHandler,这样通过mServiceHandler发送的消息都会在HandlerThread中执行。
我们需要重写onHandlerIntent方法。