1,AsyncTask运行机制
一般情况下分为四部走:
1)onPreExecute,运行在UI线程,一般作为AsyncTask开始前的界面初始化;
2)doInBackground,运行在非主线程空间,任务的后台处理过程将在这里完成,调用publishProgress调用onProgress,运行结束后调用onPostExecute;
3)onProgressUpdate,运行在UI线程,一般作为ProgressBar的更新
4)onPostExecute,运行在UI线程,当任务将要结束时运行。
2,AsyncTask的启动
1)AsyncTask的实例创建和启动都必须在主线程里执行,在主线程里调用taskInstance.execute(Params...params),如果是在非主线程里,那么onPreExecute将不能和主线程交互,就失去了AsyncTask的存在意义。
2)根据版本不同,AsyncTask决定doInBackground是运行在单线程或者是线程池里。
3)在启动过程中,如果同一个实例已经运行完或者正在运行,将会抛出IllegalStateException的异常,所以一个task实例只能执行一次。
4)在运行过程中,调用cancel方法,可以终止任务
以上所说的都是在使用AsyncTask时,需要掌握的基本知识点,下面来看一下AsyncTask的内部运行机制。
1,内部状态如下说是,默认开始状态为PENDING,在每个实例运行execute时,将会判断是否为PENDING,若否将会抛出异常
public enum Status {
/**
* Indicates that the task has not been executed yet.
*/
PENDING,
/**
* Indicates that the task is running.
*/
RUNNING,
/**
* Indicates that {@link AsyncTask#onPostExecute} has finished.
*/
FINISHED,
}
2,在初始化过程中,创建Handler(所以AsyncTask必须在主线程里创建,否则onPostExecute、onProgressUpdate将不能在UI线程里执行),handler将handle两种消息
MESSAGE_POST_PROGRESS和MESSAGE_POST_RESULT,分别将会调用onPostExecute(或者onCancelled)和onProgressUpdate。
3,内部的多线程机制是使用FutureTask完成,FutureTask:
- 构造方法摘要
- FutureTask(Callable<V> callable)
- 创建一个 FutureTask,一旦运行就执行给定的 Callable。
- FutureTask(Runnable runnable, V result)
- 创建一个 FutureTask,一旦运行就执行给定的 Runnable,并安排成功完成时 get 返回给定的结果 。
- 参数:
- runnable - 可运行的任务。
- result - 成功完成时要返回的结果。
- 如果不需要特定的结果,则考虑使用下列形式的构造:Future<?> f = new FutureTask<Object>(runnable, null)