码迷,mamicode.com
首页 > 移动开发 > 详细

Android AsyncTask

时间:2015-01-29 20:52:36      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

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_EXECUTORTHREAD_POOL_EXECUTOR

THREAD_POOL_EXECUTOR之前是AsyncTask私有的。THREAD_POOL_EXECUTOR是一个corePoolSize为5的线程池,也就是说最多只有5个线程同时运行,超过5个的就要等待。executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)与之前AsyncTask.execute()效果一样

Android AsyncTask

标签:

原文地址:http://www.cnblogs.com/liyuejiao/p/4260755.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!