關於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); }