AsyncTask是一个在不需要开发者直接操作多线程和 Handler 的情况下的帮助类,适用于短时间的操作(最多几秒)。 如需长时间的线程操作,建议使用多线程包 java.util.concurrent 中的功能,比如线程池。

3个范型参数:Params(传入参数类型), Progress (进度类型)和 Result(执行结果类型)。

4个步骤方法:

源码分析

Untitled

  1. 创建一个WorkerRunnable,再用FutureTask包装下
  2. 调用onPreEsecute(),execute()
  3. execute()将任务交给SerialExecutor,它会将任务放入任务队列
  4. 若当前没有任务执行,则调用scheduleNext(),从队列中取出一个任务交给THREAD_POOL_EXECUTOR(执行线程池)
  5. 执行线程池去执行任务,调用我们覆写的doInBackground()
  6. 任务结果用AsyncTaskResult包装,再用Message包装,发送给Handler
  7. Handler处理Message,根据Msg类型是最终结果还是中间进度,分别调用onPostExecute()和onProgressUpdate()