AsyncTask、HandlerThread、IntentService
AsyncTask原理
内部是
Handler
和两个线程池实现的,Handler用于将线程切换到主线程,两个线程池一个用于任务的派对,一个用于执行任务,当Asynctask
执行execute
方法时会封装出一个FuterTask
对象,将这个对象加入队列中,如果此时没有正在执行的任务,就执行他,执行完成之后继续执行队列中的下一个任务,执行完成通过Handler将事件发送到主线程。Asynctask
必须在主线程初始化,因为内部的Handler
是一个静态对象,在Asynctask
类加载的时候他就已经被初始化了,在Android3.0
开始,execute
的方法是串行执行任务的,一个一个来,3.0之前是并行执行的,如果要在3.0上执行并行任务,可以调用executeOnExecutor
方法。
HandlerThread原理
继承自
Thread
,start
开启线程后,会在其run
方法中通过Looper
创建消息队列并开启消息循环,这个消息队列运行在子线程中,所以可以将HandlerThread
中的Looper
实例传递给一个Handler,从而保证这个Handler的handlerMessage
方法运行在子线程中,Android
中使用HandlerThread
的一个场景就是IntentService
IntentService原理
继承自Service,它的内部封装了
HandlerThread
和Handler
,可以执行耗时任务,同时因为他是一个服务,优先级比普通线程高很多,所以更适合执行一些高优先级的后台任务。
HandlerThread
底层是通过Looper
消息队列实现的,所以他是顺序的执行每一个任务,可以通过Intent的方式开启IntentService
,IntentService
通过Handler将每一个Intent
加入HandlerThread
子线程中的消息队列,通过Looper
按顺序一个个的取出并执行,执行完后结束自己,不需要开发者手动关闭。
网友评论