线程和线程池 -- AsyncTask

一、概念

AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。从实现上来说,AsyncTask封装了Thread和Handler,通过AsyncTask可以更加方便地执行后台任务以及在主线程中访问UI,但是AsyncTask并不适合进行特别耗时的后台任务,对于特别耗时的任务来说,建议使用线程池。

二、主要方法

AsyncTask类定义如下:

public abstract class AsyncTask

AsyncTask是一个抽象的泛型类,它提供了Params、Progress、Result这三个泛型参数,其中Params表示参数的类型,Progress表示后台任务的执行进度的类型,而Result则表示后台任务的返回结果的类型,如果AsyncTask确实不需要传递具体的参数,那么这三个泛型参数可以用Void来代替。
onPreExecute:在主线程中执行,在异步任务执行之前,此方法会被调用,一般可以用于做一些准备工作。
doInBackground(Params...params):在线程池中执行,此方法用于执行异步任务,params参数表示异步任务的输入参数。在此方法中可以通过publishProgress方法来更新任务的进度,publishProgress方法会调用onProgressUpdate方法。另外此方法需要返回计算结果给onPostExecute方法。
onProgressUpdate(Progress..values):在主线程中执行,当后台任务的执行进度发生改变时此方法会被调用。
onPostExecute(Result result):在主线程中执行,在异步任务执行之后,此方法会被调用,其中result参数是后台任务的返回值,即doInBackground的返回值。
onCancelled():当异步任务被取消时会被调用。

三、注意事项

1.AsyncTask的类必须在主线程中加载,这就意味着第一次访问AsyncTask必须发生在主线程。当然这个过程在Android4.1及以上版本中已经被系统自动完成。

private static final InternalHandler sHandler = new InternalHandler();

静态变量sHandler用于切换到主线程,其创建时默认使用当前线程的Looper对象作为参数,因此这就变相要求AsyncTask的类必须在主线程中加载,否则同一个进程中的AsyncTask都将无法正常工作。

2.AsyncTask的对象必须在主线程中创建。

3.execute方法必须在UI线程调用。

4.不要在程序中直接调用onPreExecute()、onPostExecute、doInBackground和onProgressUpdate方法。

5.一个AsyncTask对象只能执行一次,即只能调用一次execute方法,否则会报运行时异常。

6.Android版本 < 1.6,AsyncTask是串行执行任务的;
Android版本 >= 1.6 && Android < 3.0,AsyncTask是并行执行任务的;
Android版本 >= 3.0,默认情况下,AsyncTask是串行执行任务的。
在Android3.0及后续的版本中,我们仍然可以通过AsyncTask的executeOnExecutor方法来并行地执行任务。

四、工作原理

AsyncTask中有两个线程池(SerialExecutor和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler),其中线程池SerialExecutor用于任务的排队,而线程池THREAD_POOL_EXECUTOR用于真正地执行任务,InternalHandler用于将执行环境从线程池切换到主线程。

你可能感兴趣的:(线程和线程池 -- AsyncTask)