一.什么是AsyncTask?

Android中,如果想要在子线程里进行UI操作,就需要借助异步消息处理机制,在Android中实现异步任务机制有两种方式,Handler和AsyncTask。Handler在上一篇文章已简单讲述,这里讲述AsyncTask的使用。AsyncTask相对于Handle,代码较为简单,使用更便捷,也可以准确控制子线程。

AsyncTask使用步骤:

  1. 新建内部类继承AsyncTask;
  2. 定义AsyncTask的三种泛型参数;
  3. 重写doInBackground抽象方法;
  4. 重写onPreExecute抽象方法;
  5. 重写onProgressUpdate方法;
  6. 重写onPostEcecute方法;
  7. 在需要启动的地方调用execute方法。

有三个泛型参数: 

class DownloadTask extends AsyncTask
三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型“。 
AsyncTask执行步骤: 
1.execute(Params… params),调用此方法,启动子线程。 execute方法必须在UI线程中调用,同时启动多个任务时,将按照先后顺序逐一执行

比较:executeOnExecutor必须在UI线程中调用,使用executeOnExecutor方法可以并行执行多个任务,但最多也只能是5个任务同时执行

2.onPreExecute(),在execute(Params… params)被调用后立即执行,此方法运行在主线程中,可对控件进行初始化设置,当然这个方法可省略。

3.doInBackground(Params… params),在onPreExecute()完成后立即执行,此方法运行在子线程中,执行费时操作,可以接收输入参数和返回计算结果。注意,这个方法不可以省略

4.onProgressUpdate(Progress… values),在调用publishProgress(Progress… values)时,此方法被执行,直接将进度信息更新到UI组件。

5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上


二.如何使用AsyncTask

带进度AsyncTask方法调用步骤:

1.定义AsyncTask

class MyTask extends AsyncTask,Integer,String>

2.在UI线程中启动AsyncTask

new MyTask().execute()
3.可初始化控件

protected void onPreExecute() {}
4.执行耗时操作

protected String doInBackground(Integer... integers) {    return null;}
5.根据String设置控件

protected void onPostExecute(String s) {}

不带进度AsyncTask方法调用步骤:

1.定义AsyncTask

class MyTask extends AsyncTask,Integer,String>

2.在UI线程中启动AsyncTask

new MyTask().execute()

3.可初始化控件

protected void onPreExecute() {}

4.执行耗时操作

protected String doInBackground(Integer... integers) {    return null;}

5.得到进度设置控件进度

protected void onProgressUpdate(Integer... values) {}

6.根据Result设置控件

protected void onPostExecute(String s) {}

三.使用AsyncTask做倒计时

  1.xml布局简单,附上代码:

            

还有xml预览图


2.首先贴上完整的Java代码,下面再进行具体描述:

public class ASdaojishiActivity extends AppCompatActivity {    private TextView daojishiTV;    private Button daojishiBtn;    private EditText daojishiEdit;    int time;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_asdaojishi);        bindID();        daojishiBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                time = Integer.parseInt(daojishiEdit.getText().toString());                daojishiBtn.setText("正在倒计时");                new MyAsyncTask().execute(time);            }        });    }    private void bindID() {        daojishiTV = findViewById(R.id.daojishi_tv);        daojishiBtn = findViewById(R.id.daojishi_btn);        daojishiEdit = findViewById(R.id.daojishi_ed);    }    class MyAsyncTask extends AsyncTask{        @Override        protected String doInBackground(Integer... integers) {            for (int i = integers[0]; i >= 0; i--){                try {                    Thread.sleep(1000);                    publishProgress(i);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            return "倒计时结束";        }        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            daojishiTV.setText(values[0]+"");        }        @Override        protected void onPostExecute(String s) {            super.onPostExecute(s);            daojishiBtn.setText(s);        }    }}

3.首先需要一个内部类

class MyAsyncTask extends AsyncTask,Integer,String>

doInBackground方法必不可少,在其内部执行耗时操作

@Override        protected String doInBackground(Integer... integers) {            for (int i = integers[0]; i >= 0; i--){                try {                    Thread.sleep(1000);                    publishProgress(i);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            return "倒计时结束";        }
这里还需要用到两种方法,onProgressUpdate和onPostExecute

@Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            daojishiTV.setText(values[0]+"");        }        @Override        protected void onPostExecute(String s) {            super.onPostExecute(s);            daojishiBtn.setText(s);        }
当然,启动AsyncTask不能缺少
new MyAsyncTask().execute(time);
publishProgress(i);//此行代码对应下面onProgressUpdate方法
return "倒计时结束";//return的String类型数值,给到onPostExecute内的参数

四.使用AsyncTask做进度条

1.xml布局简单,附上代码:

        
还有xml预览图


2.首先贴上完整的Java代码,下面再进行具体描述:

public class ASjindutiaoActivity extends AppCompatActivity {    private ProgressBar Bar;    private Button downloadBtn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_asjindutiao);        bindID();        downloadBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                downloadBtn.setText("正在下载");                new MyTask().execute();            }        });    }    private void bindID() {        Bar = findViewById(R.id.jindutiao_bar);        downloadBtn = findViewById(R.id.download_btn);        Bar.setMax(5);    }    class MyTask extends AsyncTask{        @Override        protected String doInBackground(Integer... integers) {            for (int i = 1;i <= 5;i++){                try {                    Thread.sleep(1000);                    publishProgress(i);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            return "下载完成";        }        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            Bar.setProgress(values[0]);        }        @Override        protected void onPostExecute(String s) {            super.onPostExecute(s);            downloadBtn.setText(s);        }    }}
3.首先需要一个内部类
class MyTask extends AsyncTask
doInBackground方法必不可少,在其内部执行耗时操作
 @Override        protected String doInBackground(Integer... integers) {            for (int i = 1;i <= 5;i++){                try {                    Thread.sleep(1000);                    publishProgress(i);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            return "下载完成";        }
这里还需要用到两种方法,onProgressUpdate和onPostExecute
@Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            Bar.setProgress(values[0]);        }        @Override        protected void onPostExecute(String s) {            super.onPostExecute(s);            downloadBtn.setText(s);        }    }
当然,启动AsyncTask不能缺少
 new MyTask().execute();

publishProgress(i);//此行代码对应下面onProgressUpdate方法
return "倒计时结束";//return的String类型数值,给到onPostExecute内的参数

五.Execute()和executeOnExecutor有何区别

Execute():这个函数让任务是以单线程队列方式或线程池队列方式运行,会让任务以后台单线程串行方式执行。

executeOnExecutor():这个方法通常和THREAD_POOL_EXECUTOR一起使用,允许多个任务在由AsyncTask管理的线程池中并行执行。

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android(安卓)TV热键(快捷键、组合键)实现
  3. 安卓开发学习之解决JS不能调用Android方法
  4. android 部分手机Camera 拍照 图片被旋转90度的解决方法
  5. Android(安卓)v22.0.1+ 关联 libs/*.jar 源码包的方法
  6. Android中使用Bundle交换数据
  7. LayoutInflater的用法
  8. android Service之一:不需和Activity交互的本地服务
  9. [置顶] android LayoutInflater、setContentView、findviewbyid

随机推荐

  1. 企业如何面对Tomcat的诸多安全漏洞?
  2. 一图说清Kubernetes资源控制机制:让我们重
  3. Python可以在手机上运行吗?QPython+主要功
  4. 云开发5分钟快速打造钉钉应用
  5. Secrets&安全上下文约束(SCC):让我们重新认
  6. OpenShift容量规划方法
  7. ING的容器云之路
  8. Linux系统性能调优配置文件 : RHEL8学习
  9. Python处理excel的强大工具-openpyxl
  10. 自定义性能调优文件:RHEL8学习系列2