AsyncTask是一种轻量级的异步任务类,可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。
它是一个抽象的泛型类,它提供了Params、Progress、和Result着三个泛型参数,本篇主要讲解第二个参数的应用,进度条的实现。
说一下进度条实现相关两个方法:
doInBackground(Params...params)。这是在线程池中执行的方法,该方法执行异步任务,发生在子线程中。params参数表示异步任务输入参数。这里面可以通过publishProgress方法来更新任务的进度,publishProgress方法会调用onProgressUpdate方法。
onProgressUpdate(Progress...values),这个方法是在主线程中执行的。就是当后台任务的执行进度发生改变的时候会被调用。
简单的进度条实现代码如下:
public class Progressestest extends Activity {
private ProgressBar mProgressBar;
private MyAsytask myAsytask;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progressest);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
myAsytask = new MyAsytask();
myAsytask.execute();
}
protected void onPause() {
super.onPause();
// 如果异步的不为空或者正在执行,把他取消掉
if (myAsytask != null
&& myAsytask.getStatus() == AsyncTask.Status.RUNNING) {
// cancel方法只是将对应的AsyncTask标记为cancel状态,并不是真正的取消线程的执行。
// cancel状态,结束进程
myAsytask.cancel(true);
} else {
}
}
class MyAsytask extends AsyncTask<Void, Integer, Void> {
protected Void doInBackground(Void... arg0) {
// 模拟进度条的更新
for (int i = 0; i < 100; i++) {
if (isCancelled()) {
break;
}
publishProgress(i);
try {
// 一天86400
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if (isCancelled()) {
return;
}
// 获取进度更新值
mProgressBar.setProgress(values[0]);
}
}
}
在代码中可能有几个小疑问,不知大家是否注意到doInBackground和onProgressUpadate方法它们的参数中包含...的字样,在java中...表示参数的数量不定,是一种数组型参数,它与c语言中的...是一致的。还有在起初提到的什么是泛型呢?
List<String> list = new ArrayList<String>();
list.add("gang");
list.add("oo"); //list.add(100); // 1 提示编译错误
这样一段简单的代码是不能想起来泛型的一些概念。