AsyncTask原理

来源:互联网 发布:dns优化器 安卓 编辑:程序博客网 时间:2024/06/01 20:06
AsycTask工作原理
AsycTask是一个异步任务是对handler和线程池的封装
同时他也是一个抽象类,在我们使用他的时候需要定义它的派生子类  他也是一个泛型类
里面有三个参数  params progress result
params 是doinbackgraound()方法的参数
progress AsyncTask所执行的后台任务的进度类型;
Result:后台任务的返回结果类型。

我们再来看一下AsyncTask类主要为我们提供了哪些方法:
onPreExecute() //此方法会在后台任务执行前被调用,用于进行一些准备工作
doInBackground(Params... params) //此方法中定义要执行的后台任务,在这个方法中可以调用publishProgress来更新任务进度(publishProgress内部会调用onProgressUpdate方法)
onProgressUpdate(Progress... values) //由publishProgress内部调用,表示任务进度更新
onPostExecute(Result result) //后台任务执行完毕后,此方法会被调用,参数即为后台任务的返回结果
onCancelled() //此方法会在后台任务被取消时被调用

首先来看一下execute方法的源码:

 public final AsyncTask<Params, Progress, Result> execute(Params... params) {
        return executeOnExecutor(sDefaultExecutor, params);
}

   executeOnExecutor方法调用了  onPreExecute方法,这表示了在执行后台任务前确实会调用onPreExecute方法。
   同时也调用doinbackground方法


   当doinbackground方法执行完时返回的结果由 onprogress 和   onpostexcute接收
                



AsyncTask可以以串行(一个接一个的执行)或并行(一并执行)两种方式来执行后台任务,在Android3.0及以后的版本中,默认的执行方式是串行。这个sDefaultExecutor就代表了默认的串行执行器(线程池)。也就是说我们平常在AsyncTask对象上调用execute方法,使用的是串行方式来执行后台任务。


AsyncTask的缺点
AsyncTask对象必须在主线程中创建
AsyncTask对象的execute方法必须在主线程中调用
一个AsyncTask对象只能调用一次execute方法


 corePoolSize为CPU数加一;
 maximumPoolSize为CPU数的二倍加一;
 存活时间为1秒;
 任务缓存队列为LinkedBlockingQueue。