美文网首页
关于AsyncTask的Executor的一些研究

关于AsyncTask的Executor的一些研究

作者: Jayden_ | 来源:发表于2017-09-26 14:45 被阅读0次

    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(),创建一个只有一个线程的线程池,并按先后顺序每次只运行一个

    相关文章

      网友评论

          本文标题:关于AsyncTask的Executor的一些研究

          本文链接:https://www.haomeiwen.com/subject/wxksextx.html