为了更方便的处理一些耗时操作,android提供了一些好用的工具,比如AsyncTask。借助这个就可以简单的从子线程切换到主线程。
当然这个工具也是基于异步消息处理机制的,只是安卓做了很好的封装。
首先要说明的是AsyncTask是一个抽线类,要使用它,就必须先创建一个子类再去实现实现相关功能
该抽象类的声明如下
public abstract class AsyncTask<Params, Progress, Result>
Params:开始异步任务执行时传入的参数类型;
Progress:异步任务执行过程中,返回下载进度值的类型;
Result:异步任务执行完成后,返回的结果类型;
一个简单的自定义类可以这么写
class MyTask extends AsyncTask<Void, Integer, Boolean>
这里将传入参数设置为空,是因为我们暂时不需要传入参数给后台任务
当然现在的我们自定义的类还只能算是一个空任务,内在并没有什么逻辑。为了能让我们的自定义类担当大任我们还需要重写几个方法
1.onPreExecute()
这个方法会在后台任务开始执行之间调用,在主线程执行。用于进行一些界面上的初始化操作,比如显示一个进度条对话框等。
2.doInBackground(Params)
这个方法中的所有代码都会在子线程中运行。任务完成后再通过return语句将任务结果返回。注意这里并不能进行UI操作。如果说需要反馈当前任务的执行进度,可以调用publishProgress(Progress...)方法来完成。
3.onProgressUpdate(Progress...)
当在后台任务中调用了publishProgress(Progress...)方法后,这个方法就很快会被调用,方法中携带的参数就是在后台任务中传递过来的。在这个方法中可以对UI进行操作。
4.onPostExecute(Result)
当任务执行完毕并通过return返回后,该方法就会被调用。可以通过返回的数据进行UI操作。
class MyTask extends AsyncTask<Void, Integer, Boolean> {
@Override
protected void onPreExecute() {
progressDialog.show();
}
@Override
protected Boolean doInBackground(Void... params) {
try {
while (true) {
int downloadPercent = doDownload();
publishProgress(downloadPercent);
if (downloadPercent >= 100) {
break;
}
}
} catch (Exception e) {
return false;
}
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
progressDialog.setMessage("当前下载进度:" + values[0] + "%");
}
@Override
protected void onPostExecute(Boolean result) {
progressDialog.dismiss();
if (result) {
Toast.makeText(context, "下载成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show();
}
}
}
来源:CSDN
作者:白老仙
链接:https://blog.csdn.net/qq_39474802/article/details/82875216