AsyncTask 为抽象类, 需要继承 并 指定三个泛形参数
泛形参数:
1.Params
在执行 AsyncTask 传入的参数, 用于后台任务中使用
2.Progress
后台任务执行时, 如果需要在界面上显示当前进度, 这里的泛形为进度单位
3.Result
任务执行完毕后, 对结果进行返回, 这里的泛形为返回类型
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
...
}
// Void 不需要参数给后台
// Integer 用整型作进度单位
// Boolean 作为返回值
重写 4 个方法:
-
onPreExecute()
在后台任务执行前开始调用,
完成界面初始化
-
doInBackground(Params...)
这里处理所有耗时内容, 将会运行在子线程中.
所以不可执行任何 UI 操作, 可以调用 publishProgress 方法进行 UI 更新
-
onProgressUpdate(Progress...)
当调用了 publishProgress 后, 调用本方法, 其中携带的参数就是后台任务中传递过来的
可以在此进行 UI 更新
-
onPostExecute(Result)
后台执行完毕 通过 return 返回时, 此方法被调用.
Result
作为参数传递到此方法, 一般用其进行 UI 操作.
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
protected void onPreExecute() {
progressDialog.show(); //显示进度对话框
}
protected Boolean doInBackground(Void... params) {
while(true){
int downloadPercent = doDownload(); //虚构的方法 //有嗯与计算当前下载进度并返回
publishProgress(downloadPercent);
if (downloadPercent >= 100) {
break;
}
}
return true;
}
protected void onProgressUpdate(Integer... values) {
//更新下载进度
progressDialog.setMessage("Downloaded" + values[0] + "%");
}
protected void onPostExecute(Boolean result) {
progressDialog.dismiss(); // 关闭进度对话框
// 在这里提示下载结果
if (result) {
Toast.makeText(context, "Download succeeded", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Download Failed", Toast.LENGTH_SHORT).show();
}
}
}