前言
为了更加方便我们在子线程中进行ui操作,Android还专门提供了一个更加好的工具,AsyncTask,见名知意,这是一个异步任务。可以非常简单的由子线程切换到主线程,即使你不明白异步消息的处理机制。
一、AsyncTask简介
AsyncTask实现原理也是异步消息处理机制
AsyncTask是一个抽象类 使用的时候需要去实现它
如上图有三个泛型参数分别是:
(1).params 执行AsyncTask时需要传入的参数,用于后台任务使用
(2).progress 后台执行任务时,如果界面需要显示当前进度,使用指定的泛型做单位
(3).result 任务执行完毕 需要对结果进行返回,使用这里的泛型作为结果的返回类型
经常需要重写的方法
1.onPreExecute()
这个方法会在任务执行之前调用,用于对界面的一些初始化。如:显示一个进度条
2.doInBackground(Params....)
这个方法的所有代码会在子线程运行,处理耗时任务,任务执行完成,如果第三个参数不是void,通过 return 来返回结果。注意这个方法不能进行ui操作,如果要更新ui,要调用publishProgress().
3.onProgressUpdate(Progress...)
当publishProgress()被调用,onProgressUpdate()也马上调用,这里对ui进行操作。
4.onPostExecute(Result)
当后台任务执行完毕,return返回结果作为参数,这个方法马上调用,返回的数据进行ui操作
二、AsyncTask使用步骤
首先布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<SeekBar
android:id="@+id/sk"
android:layout_width="match_parent"
android:layout_height="50dp"
android:max="100" />
<Button
android:id="@+id/btn1_progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始下载1"/>
<Button
android:id="@+id/begin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始"/>
MainActivity
public class MainActivity extends AppCompatActivity {
private Button button;
private SeekBar seekBar;
private Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.begin);
button1 = findViewById(R.id.btn1_progress);
seekBar = findViewById(R.id.sk);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DownloadTask(seekBar,button1).execute(); //启动异步任务
}
});
}
异步任务
class DownloadTask extends AsyncTask<String,Integer,String>{
private Button button;
private SeekBar seekBar;
DownloadTask(SeekBar seekBar,Button button){ //通过构造 把activitiy的活动button 和 seekar 传入异步任务
this.seekBar= seekBar;
this.button=button;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
//button = button.findViewById(R.id.btn1_progress);
//seekBar = seekBar.findViewById(R.id.sk);
button.setText("下载中"); //界面初始化
}
@Override
protected String doInBackground(String... strings) { //假设处理文件下载的耗时任务
int current=0;
//处理文件下载任务
do {
current+=10;
publishProgress(current); //需要改变ui 调用此方法
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}while (seekBar.getProgress()<=100);
return "结果";
}
@Override
protected void onProgressUpdate(Integer... values) { //执行改变ui操作
super.onProgressUpdate(values);
seekBar.setProgress(values[0]);
if (seekBar.getProgress()==100){
button.setText("下载完成");
}
}
}
真机效果演示
总结
主要对AsyncTask的参数,需要重写方法做了接单的介绍。最后用异步任务首先了一个简单的截图条功能,改变Button的text。这样更加理解AsyncTask的使用和理解。
tip:这只是我的一家之言,有错误的地方欢迎指正