一、AsyncTask的定义
由字面意思可知,AsyncTask的意思就是异步任务的意思。与我们上次学的Handler有异曲同工之妙。
- AsyncTask是Android提供的轻量级即实现代码量少的异步类;
- 为了降低异步通信的开发难度,提供了AsyncTask;
- AsyncTask直接继承于Object类,位于android.os包中;
- 使用AsyncTask可以忽略Looper,MessageQueue,Handler等复杂对象,更快捷的完成异步耗时工作。
二、AsyncTask的使用步骤
- 新建一个内部类继承AsyncTask;
- 定义AsyncTask的三种泛型参数;
- 重写四种方法,分别是重写onPreExecute方法,doinBackground抽象方法,onProgressUpdate方法和重写PostExecute方法;
- 在需要启动的地方调用execute方法;
注意点:除了doinBackground抽象方法是在子线程里执行的,其他的都是在主线程里执行的。
三、Execute()和ExecuteOnExecutor的区别
Execute()方法是串行,即使用此方法同时启动多个任务时,必须按先后顺序逐一执行;而ExecuteOnExecutor方法则是并行,即使用此方法可以同时启动多个任务,但最多也只能是5个方法同时执行。
四、 更喜欢AsyncTask还是更喜欢Handler,为什么
我的看法:两个方法都是处理异步消息的方法,都各有千秋。就我个人而言,都差不多,没有喜欢的也没有讨厌的,都可以。
五、使用AsyncTask做倒计时(附代码)
1.首先在layout布局文件中创建EditText,TextView,Button三个控件
<EditText
android:id="@+id/daojishi_et1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/daojishi_tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="15dp"
android:textSize="20sp"
android:text="倒计时" />
<Button
android:id="@+id/daojishi_btn1"
android:layout_width="90dp"
android:layout_height="50dp"
android:text="开始计时" />
2.然后在主体中定义这些控件,绑定ID
private EditText daojishiET;
private TextView daojishiTV;
private Button daojishiBtn;
private void bindID() {
daojishiET=findViewById(R.id.daojishi_et1);
daojishiTV=findViewById(R.id.daojishi_tv1);
daojishiBtn=findViewById(R.id.daojishi_btn1);
}
3.随后就是给Button控件设置监听事件
daojishiBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int time=Integer.parseInt(daojishiET.getText().toString());
new MyTask().execute(time);
}
});
4.再然后就是创建一个MyTask类来继承AsyncTask,实现doInBackground方法,onProgressUpdate方法和onPostExecute方法
class MyTask extends AsyncTask<Integer, Integer, String> {
@Override
protected String doInBackground(Integer... integers) {
for(int i=integers[0];i>0;i--){
try {
Thread.sleep(1000);
publishProgress(i);//调用onProgressUpdate方法
} 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);
daojishiTV.setText(s);
}
}
AsyncTask方法的启动在第三步完成了。
以上就是使用AsyncTask做倒计时的全部注释和代码
六、使用AsyncTask做进度条(附代码)
1.首先在layout布局里创建两个ProgressBar和两个Button控件
<ProgressBar
android:id="@+id/bar_pb"
android:paddingTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"/>
<ProgressBar
android:id="@+id/bar_pb2"
android:paddingTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"/>
<Button
android:id="@+id/down_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始下载" />
<Button
android:id="@+id/down_btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始下载2"/>
2.然后在主体里定义这些控件,绑定ID,为两个Button控件设置监听,同时设置两个ProgressBar最大长度为10
private ProgressBar barShow;
private ProgressBar barShow2;
private Button downBtn;
private Button downBtn2;
private void bindID() {
barShow=findViewById(R.id.bar_pb);
barShow2=findViewById(R.id.bar_pb2);
downBtn=findViewById(R.id.down_btn);
downBtn2=findViewById(R.id.down_btn2);
downBtn.setOnClickListener(this);
downBtn2.setOnClickListener(this);
barShow.setMax(10);
barShow2.setMax(10);
}
3.然后为两个Button控件设置点击时间,要注意的是用了switch语句来进行判断看点击了哪个Button按钮
public void onClick(View view) {
switch (view.getId()){
case R.id.down_btn:
downBtn.setEnabled(false);
downBtn.setText("正在下载");
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);
break;
case R.id.down_btn2:
downBtn2.setEnabled(false);
downBtn2.setText("正在下载");
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);
break;
}
}
4.再然后就是创建一个MyTask类来继承AsyncTask,实现doInBackground方法,onProgressUpdate方法和onPostExecute方法。在后两个方法里都同时使用了switch判断语句来看ProgressBar根据Button异步,以及下载完成后两个Button控件分别变成下载完成
class MyTask extends AsyncTask<Integer,Integer,Integer>{
@Override
protected Integer doInBackground(Integer... integers) {
int whichPb=integers[0];
for(int i=0;i<=10;i++){
try {
Thread.sleep(1000);
publishProgress(i,whichPb);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return whichPb;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
switch (values[1]){
case 1:
barShow.setProgress(values[0]);
break;
case 2:
barShow2.setProgress(values[0]);
break;
}
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
switch (integer){
case 1:
downBtn.setText("下载完成");
downBtn.setEnabled(true);
break;
case 2:
downBtn2.setText("下载完成");
downBtn2.setEnabled(true);
break;
}
}
}
AsyncTask方法的启动在第三步完成了。要注意的是启动方法改为executeOnExecutor了
以上就是使用AsyncTask做进度条的全部注释和代码