Android.AsyncTask

来源:互联网 发布:天天特价淘宝网衣服 编辑:程序博客网 时间:2024/05/22 10:35

相信每个Android应用都用到异步操作,或多或少都会将一些耗时的操作分给另外的线程或进程去处理,这样做能保证UI线程不被阻塞,UI交互不会出现无响应,能得到正常的用户体验。


在Android系统中,提供了一个比Thread更好维护的AsyncTask。

AsyncTask是一个abstract class:

public abstract class AsyncTask <Params, Progress, Result> {    public static final java.util.concurrent.Executor THREAD_POOL_EXECUTOR;    public static final java.util.concurrent.Executor SERIAL_EXECUTOR;    public AsyncTask() { /* compiled code */ }    public final android.os.AsyncTask.Status getStatus() { /* compiled code */ }    protected abstract Result doInBackground(Params... paramses);    protected void onPreExecute() { /* compiled code */ }    protected void onPostExecute(Result result) { /* compiled code */ }    protected void onProgressUpdate(Progress... values) { /* compiled code */ }    protected void onCancelled(Result result) { /* compiled code */ }    protected void onCancelled() { /* compiled code */ }    public final boolean isCancelled() { /* compiled code */ }    public final boolean cancel(boolean mayInterruptIfRunning) { /* compiled code */ }    public final Result get() throws java.lang.InterruptedException, java.util.concurrent.ExecutionException { /* compiled code */ }    public final Result get(long timeout, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedException, java.util.concurrent.ExecutionException, java.util.concurrent.TimeoutException { /* compiled code */ }    public final android.os.AsyncTask<Params,Progress,Result> execute(Params... params) { /* compiled code */ }    public final android.os.AsyncTask<Params,Progress,Result> executeOnExecutor(java.util.concurrent.Executor exec, Params... params) { /* compiled code */ }    public static void execute(java.lang.Runnable runnable) { /* compiled code */ }    protected final void publishProgress(Progress... values) { /* compiled code */ }    public static enum Status {        FINISHED, PENDING, RUNNING;        public static android.os.AsyncTask.Status[] values() { /* compiled code */ }        public static android.os.AsyncTask.Status valueOf(java.lang.String name) { /* compiled code */ }        private Status() { /* compiled code */ }    }}


其中的 doInBackground(Params... paramses) 方法就是完成多线程操作的具体入口,把要需要在另一个线程中执行的代码放到这个方法内即可。

执行的状态会分别回调到如下方法中:

onPreExecute()开始执行onPostExecute(Result result)执行完成,这里的Result是在doInBackground中返回的onCancelled() 或
onCancelled(Result result)调用cancel(boolean mayInterruptIfRunning)后,
回调到这两个Canceled方法中,
先后顺序是,onCancelled(Result result)->onCancelled()onProgressUpdate(Progress... values)维护进度的方法,在doInBackground中可以调用
publishProgress(Progress... values)来更新进度,
之后回调到此方法中







以上方法都是运行在创建此AsyncTask的线程中,只有doInBackground方法,运行在新线程中。


需要注意的是,启动执行的方法executeOnExecutor,在Android3.0以前的版本中没有此方法,是应为:

Android3.0以前的版本,多个AsyncTask是采用并行执行的;而之后的版本中,调用了execute方法后,所有的AsyncTask是单线程排队进行的,

然而,很多时候需要多个AsyncTask同时进行,所以提供了executeOnExecutor这个方法,采用线程池方式实现多个AsyncTask并行。

这个方法相对之前的execute,多了个Executor参数,来指定多个AsyncTask执行所需的线程池,可以选择AsyncTask提供的两个选项【 SERIAL_EXECUTOR | THREAD_POOL_EXECUTOR 】,当然,也可以自定义一个Executor。

  1. SERIAL_EXECUTOR  表示单线程排队执行,和调用execute方法效果一样;
  2. THREAD_POOL_EXECUTOR  表示采用线程池方法执行,可以多个AsyncTask并行。

所以启动AsyncTask的方式需要注意。


如果要取消一个AsyncTask,可以调用cancel(boolean mayInterruptIfRunning)方法,
其中的参数mayInterruptIfRunning表示要不要等待执行体运行完成,
  1. true 表示不等待执行体运行完成而直接取消,这样执行体中报出异常,然后运行状态立即回调到onCancelled();
  2. false 表示等待执行体运行完成,然后运行状态再回调到onCancelled();
一般没有特殊需求,应该采用false。

0 0
原创粉丝点击