Message,Handler,MessageQueue,Looper之间的关系
2016-06-17 17:22
323 查看
Message,Handler,MessageQueue,Looper之间的关系
Looper:是一个消息分发器,在主线程创建的时候就会创建一个Looper对象;MessageQueue :消息队列,是由Message组成的一个队列;
Handler :获取到Message,然后执行动作,可以在主线程和子线程中互相传递数据;
先大概说一下他们之间的关系:
在主线程创建之后会创建一个Looper对象,创建Looper对象的时候会去创建一个MessageQueue,而Looper是一个轮询器,会不停的轮询MessageQueue中的消息,在获取到消息之后就会把这个消息交给相应的handler来进行处理,在主线程中创建一个handler对象,这个handler对象把一个Message放到消息队列中,然后获取到消息进行处理。
线程间通信最常见的就是,子线程需要更新UI:
根据安卓系统的机制,UI只能在主线程中更新,如果我们想在子线程中更新UI,就要用到这一套机制了,在主线程和子线程之间传递信息。做法就是,现在主线程中创建一个handler对象,Looper对象和MessageQueue对象是不用创建的,因为在主线程创建的时候就创建好了。然后重写handlerMessage方法,这个方法是在handler接收到message之后执行的方法,我们把更新UI的代码放到这个方法中。然后再子线程中用sendEmptyMessage方法来发送一个消息到消息队里。在发送完这个消息之后,Looper这个轮询器因为一直在轮询消息队列。获得到这个消息之后就会执行handlerMessage方法,因为这个方法是在主线程中实现的。所以UI就可以更新了。
那要是在主线程中给子线程发送消息呢?
在主线程中给子线程发送消息:在子线程中new出来一个handler对象,然后重写handlerMessage方法,在主线程sendemptymessage,但这样是不行的,因为handler要处理消息,但是在子线程中是没有Looper对象的,我们要通过Looper.prepar来创建一个Looper对象, 在这里Looper对像被创建的时候会创建一个MessageQueue,这样就有Looper了,然后再执行完操作之后要执行以下Looper.loop方法,去轮询这些消息,让handler来处理这些消息。在安卓的源代码中,Looper.loop()方法是一个永远为true的while死循环,所以我们要在子线程中执行的动作,都要在这个方法前去执行,如果在这个方法后去执行的话,就不能被执行到了。
相关文章推荐
- Android Handler主线程和一般线程通信的应用分析
- 线程间通信
- Looper Handler MessageQueue分
- 黑马程序员——多线程之线程间的通信
- Python运行Shell命令
- JAVA学习——多线程通信
- 目标--connect world,ZMQ源码详细解析 之 进程内通信流程
- 【黑马程序员】 java笔记——线程通信
- AsyncTask和Handler的优缺点比较
- android线程间的通信机制
- 线程之间的通信
- 线程2:线程通信事件机制(单线程、两个线程、多个线程通信)
- 黑马程序员--javaSE--多线程基础总结
- Java线程通信
- 写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z
- Java多线程基础(四)Java传统线程同步通信技术
- 多线程03---NSThread
- C#学习之多线程开发技术(十)
- Android的消息处理机制——Looper,Handler和Message浅析
- JAVA学习笔记(1)_____模拟线程通信之生产者消费者问题