这里给出一个简单应用的实例,效果图如下:
点击按钮然后下方的文本开始进行颜色变换
我先来介绍一下AsyncTask这个类
AsyncTask这是一个抽象类,所以如果我们要使用,就必须要创建一个子类去继承它。在继承时我们可以为AsyncTask类指定3个泛型参数,这三个参数的用途如下:
params : 执行AsyncTask时需要传入的参数,可用于在后台任务中使用,也就是doInBackground()方法中的参数类型。
Progress : 后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型参数作为进度单位,也就是onProgressUpdate()方法中的参数类型。
Result : 第三个:当前任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型,也就是doInBackground()方法的返回类型。
注意:返回的数据作为参数传到了onPostExecute()方法中,所以也是onPostExecute()方法的参数类型。
继承AsyncTask类经常需要重写的4个方法:
onPreExecute() : 在后台任务开始之前调用,用于进行一些界面上的初始化操作。
doInBackground() : 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理耗时任务。
onProgressUpdate() : 可在这个方法中更新UI元素。
onPostExecute() : 当后台任务执行完毕并通过return语句进行返回时,这个方法就会被调用返回的数据会作为参数传到此方法中。
现在我们来看看代码
MainActivity的布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<Button
android:id="@+id/main_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="改变颜色"
android:textSize="20sp" />
<TextView
android:id="@+id/main_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center"
android:text="月中之影"
android:textSize="40sp" />
</LinearLayout>
MainActivity的java代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_change;
private TextView tv_content;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_change = findViewById(R.id.main_btn);
tv_content = findViewById(R.id.main_tv);
btn_change.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.main_btn) {
// 启动这个任务
new ChangeTextTask().execute();
}
}
// AsyncTask的三个泛型参数分别是
// 第一个:执行AsyncTask时需要传入的参数,可用于在后台任务中使用,也就是doInBackground()方法中的参数类型
// 第二个:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型参数作为进度单位,也就是onProgressUpdate()方法中的参数类型
// 第三个:当前任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型,也就是doInBackground()方法的返回类型
// 注意:返回的数据作为参数传到了onPostExecute()方法中,所以也是onPostExecute()方法的参数类型
class ChangeTextTask extends AsyncTask<Void, Integer, Void> {
// 在后台任务开始之前调用,用于进行一些界面上的初始化操作
@Override
protected void onPreExecute() {
super.onPreExecute();
}
// 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理耗时任务
@Override
protected Void doInBackground(Void... voids) {
while (true) {
try {
// 调用publishProgress()方法后,onProgressUpdate()方法很快就会被调用
// publishProgress()方法中如果传入了参数,那么这个参数传到了onProgressUpdate()方法中的values[0]
publishProgress(1);
// 休眠400毫秒
Thread.sleep(400);
publishProgress(2);
Thread.sleep(400);
publishProgress(3);
Thread.sleep(400);
publishProgress(4);
Thread.sleep(400);
publishProgress(5);
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 可在这个方法中更新UI元素
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
switch (values[0]) {
case 1:
tv_content.setTextColor(Color.RED);
break;
case 2:
tv_content.setTextColor(Color.YELLOW);
break;
case 3:
tv_content.setTextColor(Color.BLUE);
break;
case 4:
tv_content.setTextColor(Color.GREEN);
break;
case 5:
tv_content.setTextColor(Color.GRAY);
break;
default:
break;
}
}
// 当后台任务执行完毕并通过return语句进行返回时,这个方法就会被调用
// 返回的数据会作为参数传到此方法中
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}
}