AsyncTask定义了三种泛型类型 Params,Progress和Result。
1.Params 启动任务执行的输入参数,比如URL等参数。
2.Progress 后台任务执行的百分比。
3.Result 后台执行任务最终返回的结果,比如String。
三个泛型意义:
第一个泛型:doInBackground里的参数类型
第二个泛型:onProgressUpdate里的参数类型
第三个泛型:onPostExecute里的参数类型及doInBackground的返回类型
使用AsyncTask类,以下是几条必须遵守的准则:
1.Task的实例必须在UI thread中创建;
2.execute方法必须在UI thread中调用;
3.不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
4.该task只能被执行一次,否则多次调用时将会出现异常;
简单的例子:
class MTask extends AsyncTask<Void, Void, Void> {
// 1、 预加载,运行在主线程
@Override
protected void onPreExecute() {
super.onPreExecute();
}
// 2、正在加载,运行在子线程(核心方法),可以直接异步请求
@Override
protected Void doInBackground(Void... params) {
// 调用此方法,更新onProgressUpdate的进度
// publishProgress();
}
// 3、更新进度的方法,运行在主线程,可以更新UI
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
// 4、加载结束,运行在主线程(核心方法)
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
启动:
new MTask().execute("传相应的参数1","参数2","参数3"...);
有必要的话还可以重写以下这三个方法,但不是必须的:
onProgressUpdate(Progress…)
可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute()
这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。(预加载)
onCancelled()
用户调用取消时,要做的操作