Handler ,消息队列 和线程

本文探讨了消息队列作为一种常见设计模式在多线程通信中的应用,特别是在Android系统中。Android的UI线程内置了MessageQueue和Looper,允许通过Handler进行线程间通信。HandlerThread类为在其他线程中使用Handler提供了便利。每个线程的Handler共享同一MessageQueue和Looper,而Message通过obtainMessage()与特定Handler关联,再由sendMessage()将其放入对应的消息队列等待处理。
摘要由CSDN通过智能技术生成

消息队列是常见的一个设计模式,每一个线程拥有一个消息队列, 系统循环处理消息队列中的消息,线程之间通信的时候,只需要在消息队列中增加一个消息就可以了,这种设计方便实现不同线程之间的通信。 window UI线程 本身就有一个消息队列的设计, Android 同样也有一个消息队列的设计,而且他的消息队列 不仅可以用于UI线程 ,还可以用于其他线程。

android 相关于消息队列 和处理 有如下几个对象

MessageQueue , 消息 队列 ,每个线程可以 定义,而且只能定义一个。

Looper 循环器 用于循环消息队列的类 。同样每一个线程只有一个。

Handler 消息队列处理器 。 他的构造器依赖于 某个线程的 Looper ,如果用的是空构造器,它就用当前线程的loop ,我们通常在UI 线程 中用空构造器 ,所以他就是处理UI 线程的消息队列,但是实际上它也可以用于其他线程。

UI线程已经定义了这个线程相关的MessageQueue 和 Looper ,所以使用起来比较方便,我们如果要在其他线程里面想用handler ,我们不能用缺省的Thread ,而应该用专门为Handler 实现的 Thread 子类 HandlerThread , HandlerThread类已经提供了对这个线程的MessageQueue 和 Looper 支持,具体用法如下

HandlerThread thread = new HandlerThread("MyHandlerThread");
handler = new Handler(thread.getLooper);


handler 可以每一个线程定义多个,但是他们其实共用的是这个线程的同一个MessageQueue 和Looper 。但是如果定义多个handler ,每个message 应该归哪个handler 处理呢? android 里面 每个message 都定义了 处理它的handler 的。我们通常 要通过handler.obtainMessage() 方法 得到关联这个handler 的message 。然后再调用 handler.sendMessage(Message msg) 来把这个消息添加到这个handler 关联的消息队列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值