關於AsyncTask的執行序理解

關於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);  
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章