最近几日在学习Google官方给的sample的时候,碰到了这个类。没见过,完全不懂,所以查阅了一下SDK,发现这真是一个良心类,会省去不少麻烦。下面我们来看看这个有什么作用。
我们在做UI的时候,经常会使用进度条(ProgressBar)来显示当前的进度。我们通常的做法是开启一个线程,利用handle来调节ProgressBar的进度。就像下面这样:
private void doWork() {
new Thread() {
public void run() {
for (int i = 0; i <= 10; i++) {
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
mHandler.obtainMessage(PROGRESS, i, 0).sendToTarget();
}
}
}.start();
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case PROGRESS:
progressBar.setProgress(msg.arg1 * 10);
showProgress.setText(msg.arg1 * 10 + "%");
break;
default:
}
}
};
然而AsyncTask类是Google提出的另一种方法,用来实现该过程。AsyncTask主要分为3个要素和四个函数。
3要素:传入参数(Params),当前进度(Progress),传出结果(Result)
4个函数:UI预处理函数(onPreExecute()),后台处理函数(doInBackground(Params…)),进度更新函数(onProgressUpdate(Progress…)),任务结束处理函数(onPostExecute(Result))。
- UI预处理函数(onPreExecute())
主要进行UI的初始化操作,多数的情况下一般不写。 - 后台处理函数(doInBackground(Params…))
这里就是写我们要做的事,通常与publishProgress(Progress…)函数配合使用。这个一定要写(这不废话吗,当然文档这么说的)。 - 进度更新函数(onProgressUpdate(Progress…))
与publishProgress(Progress…)这个函数配合使用,一般用来更新进度条。 - 任务结束处理函数(onPostExecute(Result))
这个就是返回结果,和一些UI的后处理问题。
- AsyncTask这个类只能做内部类用
- 定义的形式:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
- 使用形式(如下),execute函数的参数就算是void类型,也要写null,不可以不写。
new DownloadFilesTask().execute(url1, url2, url3);
- 也有一些奇怪的形式如下,当然我不明白这种东西有什么用。
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
- Google说AsyncTask类最好不要做一些比较耗时的操作,最多就2~3秒(这个没有细说,我会在以后的实践中填上的)。