AsyncTask学习笔记

AsyncTask的基本使用

步骤:

  1. 继承AsyncTask
  2. 重写
    onPreExecute()
    用来做一些初始准备工作,比如初始的Dialog提示
    doInBackground()
    用来执行耗时操作
    onPostExecute()
    耗时操作结束后调用(比如做一些取消Dialog的操作)
    onProgressUpdate()
    做一些耗时过程中的界面更新操作(调用publishProgress()后才会被调用)
class DownLoadAsyncTask extends AsyncTask {

        int downLoad = 0;
        ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
        
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog.setProgress(0);
            progressDialog.setMax(100);
            progressDialog.setTitle("下载中");
            progressDialog.show();


            Log.d(TAG, "onPreExecute");
        }
        
        @Override
        protected Boolean doInBackground(Void... voids) {

            while (true) {
                try {
                    Thread.sleep(500);
                    downLoad += 1;
                    publishProgress(downLoad);

                    Log.d(TAG, "downLoad = " + downLoad);


                    if (downLoad >= 20) {
                        break;
                    }

                } catch (InterruptedException e) {
                    return false;
                }
            }

            return true;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);

            progressDialog.setMessage("" + values[0]);

            Log.d(TAG, "onProgressUpdate");
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);

            progressDialog.cancel();

            Log.d(TAG, "onPostExecute");
        }

    }

AsyncTask重要函数之间的关系

AsyncTask学习笔记_第1张图片
AsyncTask重要函数思维导图.png

AsyncTask在 Android3.0 前后的对比

3.0前:
  • 可以同时有5个任务在执行
  • 没有SerialExecutor类,直接在AsyncTask中构建了一个sExecutor常量
    规定同一时刻能够运行的线程数5、线程池大小128
3.0后:
  • 默认同时只有1个任务在执行
  • 新增了Executor类,默认使用的 SerialExecutor 内部用ArrayDeque(双端队列)管理多个Runnable对象(控制为单线程)
  • 更灵活,如果不想使用默认线程池,可以自由进行配置,使用其他的Executor,比如
Executor exec = new ThreadPoolExecutor(15, 200, 10,  
        TimeUnit.SECONDS, new LinkedBlockingQueue());  
new DownloadTask().executeOnExecutor(exec);  

上述代码就可以允许同时有15个任务执行,最多能存储200个任务

区别:

3.0前后的最大区别就是增加 Executor 类,原先的AsyncTask线程数、线程池是定死的,现在更灵活,使用不同的Executor可以进行不同的配置。

你可能感兴趣的:(AsyncTask学习笔记)