除了Thread本身以外,在Android中可以扮演线程的角色还有AsyncTask和IntentService和HandlerThread
三种类型的区别
AsyncTask
封装了线程池和Handler,它主要是为了方便开发者在子线程中更新UIHandlerThread
是一种具有消息循环的线程,它的内部都可以使用HandlerIntentService
是一个服务,内部采用HandlerThread来执行任务,当任务完毕后IntentService会自动退出。
Android3.0
开始系统要求网络访问必须在子线程中进行。AsynTask是一个抽象的泛型类,它提供了Params/Progress和Result这三个泛型参数,其中
Params
表示参数类型,Progress
表示后台任务的执行进度的类型,result
则表示后台返回结果其中AsyncTask提供了4个核心方法,含义如下
执行的顺序是 onPreExecute
先执行,接着是doInBackground,最后才是onPostExecute。(有种情况是AsyncTask还提供了onCancelled()方法,它同样在主线程中执行,当异步任务取消时,onCancelled()方法会被调用,这个时候onPostExecute则不会被调用)
AsyncTask具体有几点限制
android4.1
及以上版本中已经被系统自动完成,和在android5.0
源码中可以看出,在ActivityThread的main方法,它会调用AsyncTask的init方法,满足了在主线程中加载的条件。AsyncTask的工作原理
在默认情况下,AsyncTask是串行执行的。
SeriaExecutor
和THREAD_POOL_EXECUTOR
和一个Handler
,其中SeriaExecutor用于任务的排队,而线程池THRED_POOL_EXECUTOR用于真正地执行任务,InternalHandler用于将执行环境从线程池切换到主线程。在FuntureTask的run方法会调用mWorker的call方法,而mWorker的call方法最终会在线程池中执行。AsyncTask
必须在主线程中加载。HandlerThread
Looper.loop()来开启消息循环
,这样在实际的使用中就允许在HandlerThread中创建Handler了。在不需要使用HandlerThread时,可以通过他的quit或者quitSafely方法来终止线程的执行IntentService
stopSelf(int startId)
,是因为stopSelf(int startId)会等到所有的消息都处理完毕后才终止服务。线程池的好处
Andorid中的线程池都是直接或者间接通过配置
ThreadPoolExecutor
来实现的
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory
)
ThreadPoolExecutor在AsyncTask中的参数提现
AsyncTask的THREAD_POOL_EXECUTOR线程池的配置:
Android中常见的4类具有不同功能特性的线程池:
FixedThreadPool
:线程数量固定的线程池,它只有核心线程;CachedThreadPool
:线程数量不固定的线程池,它只有非核心线程;ScheduledThreadPool
:核心线程数量固定,非核心线程数量没有限制的线程池,主要用于执行定时任务和具有固定周期的任务;SingleThreadPool
:只有一个核心线程的线程池,确保了所有的任务都在同一个线程中按顺序执行。