AsycTask、HandlerThread、IntentService的使用场景与特点

1、AsyncTask

介绍:

AsyncTask是一种轻量级的异步任务类,可以在后台线程池中执行后台的任务,然后把执行的进度和最终的结果传递给主线程并在主线程中更新UI。从实现上来说,AsyncTask封装了ThreadHandler。但它并不适合特别耗时的任务,对于特别耗时的任务应该使用线程池。

它是一个泛型抽象类,Params表示参数的类型,Progress表示后台任务进度的类型,而Result表示结果的返回类。

 

使用特点:

1)它必须在主线程中创建,execute方法必须在主线程中调用

2execute方法只能执行一次,虽然可以传很多个参数(任务)

 

工作原理:

AsyncTask实际上是对线程池和Handler进行了封装。

1)任务执行:

3.0之前,AsyncTask是并行执行的,而3.0之后就变为了串行执行,并且开发者可以选择进行并行执行。原理是什么呢?实际上它内部有两个线程池,sDefaultExecutor是一个自己实现的串行的线程池,它是static的,说明一个进程内的所有任务都是它来执行,它的任务很简单,就是把任务放进一个队列中,然后提醒另一个并行的线程池THREAD_POOL_EXECUTOR来取出执行,如果有可取的并且当前没有任务在执行就会被这个并行的线程池来执行。如果有任务在执行自然不会执行,当这个任务执行完之后又会重新提醒并行的线程池THREAD_POOL_EXECUTOR来取出队列中的任务进行执行。所以从这个原理我们看出来它是串行执行的,原因就是老版本是并行的并且很多代码依赖于这个逻辑。

2)任务结果分发

它的内部有一个statichandler,所以这也是它必须在UI线程中进行初始化的原因,这样可以保证Handler被正常的初始化。当任务执行完成后,就会将结果发送给Handler,使得其在主线程被执行。

 2、HandlerThread

(1) HandlerThread本质上是一个线程类,继承了Thread

(2) HandlerThread有自己内部的Looper对象,可以进行Looper循环

(3) 通过获取HandlerThread的Looper对象传递给Handler对象,可以在HandleMessage方法中执行异步任务

(4) 有点事不会有阻塞,减少了对性能的消耗,缺点是不能同时进行多任务处理,需要等待进行处理,处理效率底

(5) 与线程池重并发不同,HandlerThread是一个串行队列,HandlerThread背后只有一个线程


3、IntentService

介绍:

仅仅是一个封装了HandlerThreadService而已,由于Service正常来说也是执行在主线程的,所以不能执行耗时的操作。而IntentService在内部维护有个HandlerThread,它拥有自身的Handler,对应于HandlerThreadLooper。当收到一个Intent时,它将Intent包装到Message中直接发送给Handler来处理,从而避免了在主线程中进行操作。

 

使用:

重写onHandleIntent,在其中处理Intent,并且这个是不在主线程中运行的。


IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方法和启动传统Service方法一样,同时,当任务执行完成后,IntentService会自动停止,而不需要手动去控制或者stopSelf(),另外,可以多次启动IntentService,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调中执行,并且,每次只执行一个任务,执行完成一个再执行第二个


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值