美文网首页
AsyncTask学习笔记

AsyncTask学习笔记

作者: JeffMei | 来源:发表于2017-07-24 19:33 被阅读0次

    AsyncTask的基本使用

    步骤:

    1. 继承AsyncTask
    2. 重写
      onPreExecute()
      用来做一些初始准备工作,比如初始的Dialog提示
      doInBackground()
      用来执行耗时操作
      onPostExecute()
      耗时操作结束后调用(比如做一些取消Dialog的操作)
      onProgressUpdate()
      做一些耗时过程中的界面更新操作(调用publishProgress()后才会被调用)
    class DownLoadAsyncTask extends AsyncTask<Void, Integer, Boolean> {
    
            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重要函数思维导图.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<Runnable>());  
    new DownloadTask().executeOnExecutor(exec);  
    

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

    区别:

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

    相关文章

      网友评论

          本文标题:AsyncTask学习笔记

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