一.什么是AsyncTask?
1.AsyncTask是Android提供轻量级(实现代码量少)的异步类;
2.为了降低异步通信的开发难度,提供了AsycTask;
3.AsyncTask直接继承于Object类,位于android.os包中;
4.使用AsyncTask可以忽略Looper MessageQueue Handler等复杂的对象,更便捷的完成异步耗时操作。
AsyncTask的泛型参数和常用方法
AsyncTask的三种泛型参数:
Params:启动任务执行的输入参数;
Progress:后台任务执行的额百分比;
Result:后台执行任务最终返回的结果。
常用方法:
onPreExecute:
1.异步任务开始执行时,系统最先调用此方法;
2.此方法运行在主线程中,可以对控件进行初始化等操作。
doInBackground:
1.执行完onPreExecute方法后,系统执行此方法。
2.此方法运行在主线称中,比较耗时的操作放在此方法中执行。
onProgressUpdate:
1.显示当前进度,适用于下载或扫描这类需要实时显示进度的需求;
2.此方法运行在主线程中,可以修改控件状态,例如:显示百分比;
3.触发此方法,需要在doInBackground中使用publishProgress方法。
publishProgress:
1.在doInBackground中使用;
2.用于触发onProgress方法
onPostExecute:
1.当异步任务执行完成后,系统会自动调用此方法;
2.此方法运行在主线程中,可以修改控件状态,例如:下载完成。
二.如何使用AsyncTask?
AsyncTask的执行过程:UI线程 - 启动AsynsTask - 执行耗时操作 - 接受消息。
1.新建内部类继承AsykcTask;
2.定义AsyckTask的三种泛型参数;
3.重写doInBackground抽象方法;
4.重写onPostExecute方法;
5.重写onProgreeUpdate方法;
6.重写onPreExecute方法;
7.在需要启动的地方调用execute方法。
三.使用AsyncTask做倒计时(附代码)
public class MainActivity extends AppCompatActivity {
private EditText timeet;
private TextView timetv;
private Button daojishibtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();
daojishibtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int time=Integer.parseInt(timeet.getText().toString());//把int类型转换成String类型
new MyTask().execute(time);
}
});
}
private void bindID() {
timeet=findViewById(R.id.time_et);
timetv=findViewById(R.id.time_tv);
daojishibtn=findViewById(R.id.daojishi_btn);
}
class MyTask extends AsyncTask<Integer,Integer,String>{
@Override
protected String doInBackground(Integer... Integer) {
for(int i=Integer[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);
timetv.setText("倒计时:"+values[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
daojishibtn.setText(s);
}
}
}
布局:
<EditText
android:id="@+id/time_et"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/time_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/daojishi_btn"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="带进度AsyncTask倒计时"/>
</LinearLayout>
四.使用AsckyTask做进度条(附代码)
<ProgressBar
android:id="@+id/pb1"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100" />
<ProgressBar
android:id="@+id/pb2"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100" />
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="开始下载"/>
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="开始下载"/>
</LinearLayout>
布局:
public class Jindutiao extends AppCompatActivity implements View.OnClickListener{
private Button btn1;
private Button btn2;
private ProgressBar pb1;
private ProgressBar pb2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jindutiao);
bindID();
}
private void bindID() {
btn1=findViewById(R.id.btn1);
btn2=findViewById(R.id.btn2);
pb1=findViewById(R.id.pb1);
pb2=findViewById(R.id.pb2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
pb1.setMax(10);//设置最大值
pb2.setMax(10);//设置最大值
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn1:
btn1.setEnabled(false);
btn1.setText("正在下载");
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);//改成并行
break;
case R.id.btn2:
btn2.setEnabled(false);
btn2.setText("正在下载");
new MyTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,2);//改成并行
break;
}
}
class MyTask extends AsyncTask<Integer,Integer,Integer>{
@Override
protected Integer doInBackground(Integer... integers) {
int whichpb=integers[0];//定义任意一个数两步
for(int i=1;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:
pb1.setProgress(values[0]);
break;
case 2:
pb2.setProgress(values[0]);
break;
}
}
@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
//定义选择两个下载按钮
switch (integer){
case 1:
btn1.setText("下载完成");
btn1.setEnabled(true);
break;
case 2:
btn2.setText("下载完成");
btn2.setEnabled(true);
break;}
}
}
}
五.Excute和excuteOnExcutor的区别:
Excute实现的是串行,excuteOnExcutor实现的是并行。
六.更喜欢AsckyTask还是Handler,为什么?
更喜欢AsckyTask,因为使用AsckyTask,简单,快捷,适用于下载,获取网络数据这样的场景。