Android之AsyncTask

AsyncTaskandroid提供的轻量级的异步类。在Android系统种,UI的绘制必须在主线程种进行进行。对于耗时的后台操作可以通过AsyncTask执行。应用中可以通过直接继承AsyncTask,在类中实现异步操作,并通过相应的接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程

Android系统提供的AsyncTask,并对其进行了封装,在使用上简单很多。AsyncTask比Handler更轻量,适合与比较简单的任务。AsyncTask泛型类定义如下:

AsyncTask<Params, Progress, Result> 其中:

l Params:用于设置executedoInBackground方法的参数的数据类型。

l Progress:用于设置onProgressUpdatepublishProgress方法的参数的数据类型。

l Result:用于设置onPostExecute方法的参数的数据类型和doInBackground方法的返回值类型。

 

AsyncTask的调用顺序如下:

 

1.继承AsyncTask并实现相应的方法。

2.建立AsyncTask子类实例并调用execute方法。

3.执行execute后并从线程池种获取到线程后,主线程将先调用onPreExecute方法,执行Task的初始化操作。

4.执行doInBackground,调用execute传入的参数将传到此方法种。在此方法种执行后台任务的过程中,可以通过调用publicProgress方法像主线程种的Handler发送执行进度消息,主线程收到相应的消息后会调用onProgressUpdate方法,在onProgressUpdate可以进行UI跟新操作。

5.doInBackground执行完成后,主线程会调用onPostExecute

 

先来一个应用实例

稍后上传...

 

进一步分析

 

通过上面的分析AsyncTask主要可以分为两部分,一个是与主线程的各种交互,另一个是后台执行线程及任务的管理和调度。虽然可以同时有多个AsyncTask的子类实例,但是AsyncTask内部的HandlerThreadPoolExecutor都是进场范围内共享的,都是static的,即属于类的。类的属性的作用范围是CLASSPATH

因为一个进场一个VM,所以AsyncTask类控制着进程类所有的其子类实例。

AsyncTask在内部会建立一个进程作用域的线程池来管理要运行的任务。当AsyncTask的子类调用了execute方法之后,AsyncTask就会吧任务交给线程池,由线程池来管理创建和运行ThreadAsyncTask在不同的版本种的实现是不一样的。

API10之前的版本中

AsyncTask默认是通过线程池调度执行,线程池的限制5个任务同时运行。所以,当启动多过5个任务时,那么就会有5个任务同时执行,后面的任务要等前面的任务执行完成后才可以进行。而且,AsyncTask必须这样执行,没有办法进行控制,比如任务需要顺序串行执行时,AsyncTask就没有办法帮你管理这些任务了,Api11以后的系统就此做出了调整。

API11之后的版本中

API11之后对AsyncTask进行了调整,新增加了线程池SERIAL_EXECUTOR(序列线程池),一次只允许一个任务执行,并将他作为默认线程池。同时,也可以选择THREAD_POOL_EXECUTOR(这是之前AsyncTask默认的线程池,只是之前是AsyncTask私有的,API11以后的版本种开放给了用户),可以通过executeOnExecutor()接口来选择此线程池来执行任务,与之前的版本一样,该线程池之允许5个任务同时执行。当然,你也可以创建自己的线程池(Executors.newCachedThreadPool())供AsyncTask使用。

 

所以,AsyncTask任务不是execute之后就会马上执行的,他还取决与当前AsyncTask任务的执行状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值