您的位置:首页 > 移动开发 > Android开发

Android 的Handler、Looper与HandlerThread

2015-03-29 17:19 190 查看
一、Android系统中的Java应用程序都是靠消息驱动来工作的。大致原理如下:

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

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

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



二、Handler、Looper与HandlerThread的总体关系概述。

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

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

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



三、Looper类

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

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

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



四、Handler类

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

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

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

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



五、HandlerThread类

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

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

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

参考资料:邓凡平《深入理解Android》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: