关于AsyncTask的执行序理解
- AsyncTask的基本使用:
class DownloadTask 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) {
// 该回调函数是在调用publishProgress(Progress...)函数后被回调
progressDialog.setMessage("当前进度:" + values[0] + "%");
}
@Override
protected void onPostExecute(Boolean result) {
// 该回调在后台任务执行完成被回调
progressDialog.dismiss();
if (result) {
Toast.makeText(context, "下载成功", 0).show();
} else {
Toast.makeText(context, "下载失败", 0).show();
}
}
doInBackground是怎么被执行的
// 1、在AsyncTask的无参构造函数中构造如下对象 // WorkRunnable是一个实现Callable接口的抽象类 mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { return postResult(doInBackground(mParams)); } }; // 使用FutureTask(Callable)构造函数构造出mFuture对象 mFuture = new FutureTask<Result>(mWorker) // 在FutureTask的内部会构造出Sync内部类 public FutureTask(Callable<V> callable) { sync = new Sync(callable); } // 3、在调用AsyncTask的execute的函数时候 onPreExecute(); mWorker.mParams = params; exec.execute(mFuture); // 4 、exec.execute具体会执行到以下类的中,最终调用r.run // 而,run函数是FutureTask中的run函数,会调用到其内部类的sync.innerRun(); private static class SerialExecutor implements Executor { public synchronized void execute(final Runnable r) { r.run(); }}; // 5、innerRun中会调用到Callable的call函数,就执行到了doInBackground void innerRun() { runner = Thread.currentThread(); V result; result = callable.call(); set(result); }