首页 > 代码库 > Android AsyncTask
Android AsyncTask
AsyncTask是抽象类.(Android1.5)
AsyncTask定义了三种泛型类型:Params,Progress,Result。
Params 启动任务执行的输入参数,e.g.HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,e.g.String
AsyncTask后台线程运行的五个状态, 提供了五个回调函数:
1、准备运行: onPreExecute() 执行后台任务前UI操作
2、正在后台运行: doInBackground(Params...) 后台线程
3、进度更新: 调用publishProgress()方法,UI线程调用onProgressUpdate(Progress...)更新界面。
4、完成后台任务: onPostExecute(Result)
5、取消任务
AsyncTask实例必须在UI线程中创建,execute()必须在UI线程中调用
AsyncTask的内部实现是一个线程池,每个后台任务会提交到线程池中的线程执行,然后使用Thread+Handler的方式调用回调函数
调用了AsyncTask#execute()后,AsyncTask会把任务交给线程池,由线程池来管理创建和运行Therad。不同版本的内部的线程池Android的实现方式是不一样的。
API < 11:
AsyncTask#execute()内部的线程池限制是5个(只能有5个线程同时运行),超过的线程只能等待,等待前面的线程某个执行完了才被调度和运行。(API11以前无法解决,需要大量的后台线程去执行任务,只能放弃AsyncTask, 自己创建线程池来管理Thread).
小心的设计应用,错开使用AsyncTask的时间,尽力做到分时。
API >=11:
AsyncTask#execute()提交的任务,按先后顺序每次只启动一个线程执行一个任务,完成之后再执行第二个任务,相当于只有一个后台线程在执行所提交的任务(Executors.newSingleThreadPool())。
新增接口AsyncTask #executeOnExecutor()
允许开发者提供自定义的线程池来运行和调度Thread,使所有任务都能并发同时运行,创建一个没有限制的线程池(Executors.newCachedThreadPool())。AsyncTask实例就有了自己的线程池而不必使用AsyncTask默认的。
新增了2个预定义的线程池:SERIAL_EXECUTOR和THREAD_POOL_EXECUTOR
THREAD_POOL_EXECUTOR之前是AsyncTask私有的。THREAD_POOL_EXECUTOR是一个corePoolSize为5的线程池,也就是说最多只有5个线程同时运行,超过5个的就要等待。executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)与之前AsyncTask.execute()效果一样。
Android AsyncTask