27
2017
09

关于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(),创建一个只有一个线程的线程池,并按先后顺序每次只运行一个
上一篇:view的生命周期 下一篇:AS中的minSdkVersion、compileSdkVersion、targetSdkVersion、buildTools及tools关系和区别