前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AsyncTask记录

AsyncTask记录

原创
作者头像
木子杂志
修改2020-08-14 17:55:58
3070
修改2020-08-14 17:55:58
举报
文章被收录于专栏:木子杂志木子杂志
AsyncTask原理
  1. AsyncTask 默认逻辑是:一个调度队列(sDefaultExecutor)将所有要执行的任务添加队列. 然后从队列获取runnable,放入线程池(THREAD_POOL_EXECUTOR). 串行执行
  2. 线程池+Handler机制来更新 UI,  在Callable对象的 call()方法回调结果
AsyncTask 基本使用
代码语言:javascript
复制
private class MyTask extends AsyncTask<String, String, String> {
   
   //...
}

使用

代码语言:javascript
复制
MyTask myTask = new MyTask();
myTask.execute(url);
AsyncTask 怎么串行执行的?
代码语言:javascript
复制
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 如何并行执行?
代码语言:javascript
复制
MyTask myTask = new MyTask();
myTask.executeOnExecutor((AsyncTask.THREAD_POOL_EXECUTOR));
代码语言:javascript
复制
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 使用
  • 线程池

更多内容 欢迎关注公众号

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AsyncTask原理
  • AsyncTask 基本使用
    • AsyncTask 怎么串行执行的?
      • AsyncTask 如何并行执行?
        • 涉及知识点
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档