Android中的线程和线程池

来源:互联网 发布:新编诸子集成知乎 编辑:程序博客网 时间:2024/06/05 09:56

线程在Android中是一个重要的概念,从用途上来说,线程分为主线程和子线程,主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作。除了Thread本身以外,在Android中可以扮演线程角色的还有很多,比如AsyncTask和IntentService,同时HandlerThread的表现形式也是一种特殊的线程。尽管AsyncTask、IntentService以及HandlerThread的表现形式都有别于传统的线程,但是他们的本质仍然是传统的线程。对于AsyncTask来说,它的底层用到了线程池,对于IntentService和HandlerThread来说,他们的底层则直接使用了线程。
不同形式的线程虽然都是线程,但是它们仍然具有不同的特性和使用场景。AsyncTask封装了线程池和Handler,它主要是为了方便开发者在子线程更新UI。HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler。IntentService是一个服务,系统对其进行了封装使其可以更方便地执行后台任务,IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出。从任务执行的角度来看,IntentService的作用很像是一个后台线程,但是IntentService是一种服务,它不容易被系统杀死从而可以尽量保证任务的执行,而如果是一个后台线程,由于这个时候进程没有活动的四大组件,那么这个进程的优先级就会非常低,会很容易被系统杀死,这就是IntnetService的优点。

HandlerThread
是一种使用Handler和Thread的Thread,它是通过从run()方法中添加Looper.prepare()来创建消息队列,并通过Looper.loop()来开启消息循环,这样在实际的使用中就允许在HandlerThread中创建Handler了。
他和普通的Thread有显著区别,普通Thread主要用于在run方法中执行一个耗时任务,而HandlerThrad在内部创建了消息队列,外界需要通过Handler的消息方式来通知HandlerThread执行一个具体的任务。Handelr是一个很有用的类,它在Android中的一个具体的使用场景是IntentService,由于Handler的run方法是一个无线循环,因此当明确不需要再使用Hnadler时,可以通过 quit或者quitSafely。

IntentService
IntentService是一种特殊的Service,它继承了Service并且它是一个抽象类,因此必须创建它的子类才能使用IntentService。IntentService可用于执行后台耗时任务,当任务执行后他会自动停止,同时由于IntentService是服务的原因,这导致它的优先级比单纯的线程要高很多,所以IntentService比较适合执行一些高优先级的后台任务,因为它优先级高不容易被系统杀死。在实现上,IntentService封装了HandlerThread和Handler。

IntentService仅仅是通过mServiceHandler发送了一个消息,这个消息会在HandlerThread中被处理。mServiceHandler收到消息后,会将Intent对象传递给onHandlerIntent方法去处理。通过这个Intent对象即可解析出外界启动IntentService时所传递的参数,通过这些参数就可以区分具体的后台任务,这样在onHandleIntetn方法中就可以对不同的后台任务做处理了。当onHandleIntent方法执行结束后,IntentService会通过stopSelf(int startID)方法来尝试停止服务。这里之所以采用stopSelf(int startId)而不是stopSelf()来停止服务。那是因为stopSelf()会停止服务,而这个时候可能还有其他消息未处理,stopSelf(int startID)则会等待所有消息都处理完毕后才终止服务。一般来说,stopSelf(int startID)在尝试停止服务之前会判断最近启动服务的次数是否和startID相等,如果相等就立刻停止服务,不想的那个就不停止服务,这个策略可以从AMS的stopServiceToken方法的实现中找到依据。
0 0
原创粉丝点击