Android 的Handler、Looper与HandlerThread

一、Android系统中的Java应用程序都是靠消息驱动来工作的。大致原理如下:

1、有一个消息队列,可以不断的往里面投递消息。

2、有一个消息处理机制,可以不断的往里面取消息然后处理。

一般来说,事件源把待处理的消息加入消息队列时,是加到队列尾(用sendMessage(...)),而一些优先级较高的消息也可以加到队列头(用sendMessageAtFrontOfQueue(...))。

 

二、HandlerLooperHandlerThread的总体关系概述。

1、一般来说,在多线程编程下会使用到这几者。在主线程中用HandlerThread创建带有消息队列的子线程,使用HandlerThread对象的getLooper方法将阻塞式创建子线程的Looper

2Handler是辅助类,用来进行消息投递与消息处理操作。创建Handler时一般会跟新线程的Looper绑定。

3、在主线程中重写handleMessage方法,处理Looper中的消息。

 

三、Looper

1Looper用于封装消息循环与一个消息队列。主要有prepare()loop()两个成员方法。

2prepare()中会new一个Looper对象,并通过调用ThreadLocal机制的set()方法,把Looper与调用线程关联在一起。

3loop()中会取出当前Looper的消息队列,以死循环的方式逐个处理,调用的是dispatchMessage方法,最后会去到Handler子类的handleMessage方法。

 

四、Handler

1Handler是辅助类,提供一系列方法完成消息创建、消息投递与消息处理工作。

2、消息创建与移除比较简单,调用obtainMessage即可创建一个消息,调用removeMessage即可移除一个消息;

3Handler在做消息投递时,会将每一个经过自己手里的Messagetarget设置成该Handlertarget。后续在dispatchMessage时就会根据这个target交给相应的Handler处理。

4、理论上假如没有Handler也是可以的,那么程序员就需要自己构造Message并处理target变量、处理looper中消息队列的投递操作、以及消息处理等操作,比较繁琐而且容易出错。

 

五、HandlerThread

1、这个类的出现主要是为了解决一个问题:主线程上创建子线程的Handler时是根据子线程的Looper来创建的,而创建Handler时这个子线程的run方法可能还没执行,也就是说Looper还没创建出来。HandlerThread就是用来处理这个问题的。

2HandlerThread中的getLooper方法是以synchronized方式阻塞式返回Looper对象的,因此如果主线程使用HandlerThread来创建新线程,用getLooper赋值给Handler时,这个Looper对象就一定时创建好了的。




这些都是本人思考与实践后的总结,如有不正确的地方,还望指教。

参考资料:邓凡平《深入理解Android》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值