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》
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》
相关文章推荐
- Android中的Looper、Handler与HandlerThread
- Android Looper,handler,HandlerThread
- Android学习--后台线程之Looper、Handler、HandlerThread
- Android 线程通信(Handler + Message + Looper) 4 - HandlerThread
- Android 中 Handler,Looper,HandlerThread 的关系分析
- android下关于Handler、Looper、HandlerThread之间的联系与区别
- Android的Looper和Handler和HandlerThread
- 理解Android核心:Looper, Handler和HandlerThread
- Android异步消息之Looper、Handler、Message、HandlerThread的关系
- Android-Handler 总结(Handler 的使用 ,Looper , MessageQueue , HandlerThread )
- [Android]Handler-Looper-MessageQueue-Message、HandlerThread
- Android-Handler 总结(Handler 的使用 ,Looper , MessageQueue , HandlerThread )
- Android应用程序消息处理机制(Looper、Handler)分析
- Android中的MessageQueue,Handler,Looper和Thread2
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android应用程序消息处理机制(Looper、Handler)分析(3)
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- 【Android开发】线程间通讯机制(基础篇)——Handler、Runnable、HandlerThread、AsyncTask的使用
- Android的消息处理机制(图+源码分析)——Looper,Handler,Message