AsyncTask记录

时间:2022-07-23
本文章向大家介绍AsyncTask记录,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

AsyncTask原理

  1. AsyncTask 默认逻辑是:一个调度队列(sDefaultExecutor)将所有要执行的任务添加队列. 然后从队列获取runnable,放入线程池(THREAD_POOL_EXECUTOR). 串行执行
  2. 线程池+Handler机制来更新 UI,  在Callable对象的 call()方法回调结果

AsyncTask 基本使用

private class MyTask extends AsyncTask<String, String, String> {
   
   //...
}

使用

MyTask myTask = new MyTask();
myTask.execute(url);
AsyncTask 怎么串行执行的?
public abstract class AsyncTask<Params, Progress, Result> {
   
   public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
   //默认的执行器就是SerialExecutor
   private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;    
   //
   public final AsyncTask<Params, Progress, Result> execute(Params... params) {
       // 默认的执行器sDefaultExecutor
       return executeOnExecutor(sDefaultExecutor, params);
  }
   
   private static class SerialExecutor implements Executor {
       final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
       Runnable mActive;

       public synchronized void execute(final Runnable r) {
           mTasks.offer(new Runnable() {
               public void run() {
                   try {
                       //【2】
                       r.run();
                  } finally {
                       //【3】
                       scheduleNext();
                  }
              }
          });
           // 【0】仅第一个任务执行
           if (mActive == null) {
               scheduleNext();
          }
      }

       protected synchronized void scheduleNext() {
           //【1】
           if ((mActive = mTasks.poll()) != null) {
               THREAD_POOL_EXECUTOR.execute(mActive);
          }
      }
  }    
}
  • try{}finally{} 代码块保证先执行 r.run(),执行完成之后执行finally代码块
  • 因此上面的代码【2】执行完毕执行【3】,接着进入【1】判断队列不为空 线程池接着执行新的 runnable,再次进入【2】处. 如此往复执行.保证了串行执行
AsyncTask 如何并行执行?
MyTask myTask = new MyTask();
myTask.executeOnExecutor((AsyncTask.THREAD_POOL_EXECUTOR));
public abstract class AsyncTask<Params, Progress, Result> {

   private final FutureTask<Result> mFuture;    
   
   //
   public static final Executor THREAD_POOL_EXECUTOR
           = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
                   TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);  
   public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
           Params... params) {
       //...
     
       exec.execute(mFuture);

       return this;
  }    
}

直接使用THREAD_POOL_EXECUTOR 执行我们的 mFuture,就是并行执行

涉及知识点
  • FutureTask 使用
  • 线程池

更多内容 欢迎关注公众号