关于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);  
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值