关于AsyncTask的Executor的一些研究

AysncTask的基本使用

public class MyAsyncTask extends AsyncTask<String, Integer, String> {

    private ProgressBar mProgressBar;

    public MyAsyncTask(ProgressBar progressBar) {
        mProgressBar = progressBar;
    }

    /**
     * 运行在子线程,执行耗时操作
     */
    @Override
    protected String doInBackground(String... params) {
        try {
            for (int i = 1; i <= 10; i++) {
                Thread.sleep(200);
                publishProgress(i * 10);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return params[0] + " = " + Thread.currentThread().getName();
    }

    /**
     * 子线程(doInBackground)执行过程中,与主线程通信
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        mProgressBar.setProgress(values[0]);
    }

    /**
     * 子线程(doInBackground)执行完毕
     */
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        //mProgressBar.setVisibility(View.GONE);
        Log.i("onPostExecute", s);
    }
}

AsyncTask提交任务的方法

1、asyncTask.execute()
2、anyncTask.executeOnExecutor()

注意:一个AsyncTask实例只能execute一次,否则会报

java.lang.IllegalStateException: Cannot execute task: the task is already running
  1. asyncTask.execute()
    线程池最多五个线程,按先后顺序每次只运行一个,也就是说它是按提交的次序,每次只启动一个线程执行一个任务,完成之后再执行第二个任务,也就是相当于只有一个后台线程在执行所提交的任务

  2. asyncTask.executeOnExecutor(Executor exec,Params... params)

  • 这个接口允许开发者提供自定义的线程池来运行和调度Thread。
  • 系统预定义了两个线程池SERIAL_EXECUTORTHREAD_POOL_EXECUTOR
    其中SERIAL_EXECUTOR的效果和asyncTask.execute()一样。
    THREAD_POOL_EXECUTOR是一个corePoolSize为5的线程池,也就是说最多只有5个线程同时运行,超过5个的就要等待。

自定义Executor

  • Executors.newCachedThreadPool(),创建一个无大小限制的线程池,自动新增子线程
  • Executors.newScheduledThreadPool(int corePoolSize),创建一个corePoolSize大小的线程池,允许corePoolSize个线程并发
  • Executors.newSingleThreadScheduledExecutor(),创建一个只有一个线程的线程池,并按先后顺序每次只运行一个
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • AsyncTask异步任务,用于执行耗时任务并在UI线程中更新结果。 我们都知道,Android UI线程中不能执...
    iyifei阅读 8,811评论 2 9
  • 简介 1. 线程分类 主线程(UI线程) : 处理和界面相关的事情. 子线程 : 处理耗时操作. Android中...
    王世军Steven阅读 4,417评论 0 2
  • 虽说现在做网络请求有了Volley全家桶和OkHttp这样好用的库,但是在处理其他后台任务以及与UI交互上,还是需...
    weishu阅读 8,665评论 10 55
  • 前段时间遇到这样一个问题,有人问微信朋友圈的上传图片的功能怎么做才能让用户的等待时间较短,比如说一下上传9张图片,...
    加油码农阅读 4,941评论 0 2
  • AsyncTask是一只命途多舛的小麻雀,为什么说它命途多舛,因为它一直被反复折腾,从Android 1.6之前,...
    geniusmart阅读 8,828评论 3 37