Android的AsyncTask原理和配置

来源:互联网 发布:五常大米价格 知乎 编辑:程序博客网 时间:2024/06/05 10:05

先来看看AsyncTask的定义:

[java] view plain copy
  1. public abstract class AsyncTask<Params, Progress, Result> { 

AsyncTask是一个抽象类,它是对thread和Handler的封装,我们要使用他就必须创建一个子类来继承他

三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。

一个异步任务的执行一般包括以下几个步骤:

1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行,必须在UI线程中调用

2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记,进行初始化

3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息,任务一旦完成就可以通过return语句来将任务的执行结果进行返回

4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。

5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。

在使用的时候,有几点需要格外注意:

1.异步任务的实例必须在UI线程中创建。

2.execute(Params... params)方法必须在UI线程中调用。

3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。

4.不能在doInBackground(Params... params)中更改UI组件的信息。

5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。

6.Asynctask还提供了onCancelled方法,在主线程中执行,当异步任务取消后,onCancelled方法会被调用,这个时候onPostExecute不会被调用

7.Asynctask有两个线程池和一个Handler,一个线程池用于任务的排队,一个线程池用于真正执行任务,handler将执行环境从线程池切换到主线程,AsyncTask是串行执行任务

总结:我们在主线程调用execute方法,execute会调用onPreExecute方法,系统会把params参数封装成一个futuretask并把它插入到任务队列中,执行futuretask实例会调用doInBackground方法,如果我们在doInBackground方法中调用publishProgress方法,就会通过handler发送一条消息MESSAGE_POST_PROGRESS,handler处理消息时onProgressUpdate方法会被调用,后台任务执行完成后发送一条MESSAGE_POST_RESULT的消息,sHandler处理消息时会判断任务是否被取消,取消调用onCancelled方法,否则调用onPostExecute(Result result)方法。


  AsyncTask配置:

核心线程数=cpu核心数+1

非核心线程数=cpu核心数*2+1

任务队列的容量=128

核心线程无超时机制,非核心线程在闲置时的超时时间为1s

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝53天几天没大便了怎么办 42天宝宝4天没有大便怎么办 42天的宝宝3天没大便怎么办 6个月宝宝前额头碰青了怎么办 三个月的婴儿喝牛奶拉绿大便怎么办 已经喂了猫一个多月的高钙奶怎么办 几个月宝宝胳膊起来红豆豆怎么办 一岁半宝宝只喝牛奶不吃饭怎么办 儿子一生下来脖子上有淋巴结怎么办 满月宝宝睡觉不踏实易惊醒怎么办 两个月宝宝从婴儿车上掉下来怎么办 兔子不吃兔粮不喝水不拉粑粑怎么办 兔子吃了带水的菜叶怎么办 七个月的宝宝晚上睡觉总醒怎么办 紫薯和番茄一起吃了怎么办 1当半宝宝喝温开水后打隔怎么办 婴儿屁股拉便便肛门有点烂了怎么办 婴儿便便之后肛门就红怎么办 50天的宝宝三天不拉大便怎么办 两个月宝宝不拉屎只放屁怎么办 两个月大宝宝两天没拉屎怎么办 两个月宝宝三天没拉大便怎么办 5个月宝宝3天没拉大便怎么办 4个月宝宝3天没拉大便怎么办 20个月的宝宝大便干燥怎么办 20个月宝宝大便间隔三天怎么办 两个多月的宝宝四天没大便怎么办 两个多月的宝宝几天没大便怎么办 2个月3天没大便怎么办 两个月大的宝宝发烧40度怎么办 两个月大的宝宝感冒了怎么办 四个月宝宝拉水样大便要怎么办 六个月的宝宝咳嗽有痰怎么办 未满月的宝宝大便脓状怎么办 五个月的宝宝总是吃手怎么办 小孩子学数字怎么也学不会怎么办 小孩学数字老是学不会该怎么办 只买了大人票忘买儿童的了怎么办 铝合金滑动门没轨道安纱门怎么办 移门衣柜门与柜体有冶缝隙怎么办 推拉门关门时撞门框声音大怎么办