Android AsyncTask学习笔记

来源:互联网 发布:basetypehandler 源码 编辑:程序博客网 时间:2024/06/04 18:01

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:

  1. 构造方法摘要  
  2. FutureTask(Callable<V> callable)   
  3.           创建一个 FutureTask,一旦运行就执行给定的 Callable。  
  4.   
  5. FutureTask(Runnable runnable, V result)   
  6.           创建一个 FutureTask,一旦运行就执行给定的 Runnable,并安排成功完成时 get 返回给定的结果 。  
  7. 参数:  
  8. runnable - 可运行的任务。  
  9. result - 成功完成时要返回的结果。  
  10. 如果不需要特定的结果,则考虑使用下列形式的构造:Future<?> f = new FutureTask<Object>(runnable, null)  
在AsyncTask内部使用的是Callable构造FutureTask。Callable和FutureTask的结合本身是异步线程并返回结果的一套很好的方案。




0 0
原创粉丝点击