关于Handle机制这一篇就够了

本文详细介绍了Android消息机制的核心组件,包括Message、MessageQueue、Looper和Handler,以及它们在实现异步操作、线程通信和事件驱动中的作用。还涵盖了消息发送、处理、队列机制以及空闲处理器的使用。
摘要由CSDN通过智能技术生成

Android消息机制是Android系统实现异步操作、线程间通信以及事件驱动的核心机制之一。其核心组件包括HandlerLooperMessageQueueMessage。下面结合代码,分析Android消息机制的整个流程。

1. Message

Message类表示一个待处理的信息或事件。它包含了消息的描述和任何相关的数据。

2. MessageQueue

MessageQueue是一个消息队列,用于存放待处理的Message对象。

3. Looper

Looper对象用于管理一个消息队列(MessageQueue),它不断地从队列中取出消息,然后将消息分发给相应的处理者。每个线程只能有一个Looper对象。

4. Handler

Handler用于发送和处理消息或Runnable对象。它与发送者的线程以及包含消息队列的Looper对象相关联。

流程分析

创建Looper和MessageQueue

通常,在主线程(UI线程)中,LooperMessageQueueActivityThreadmain方法中自动创建:

public static void main(String[] args) {
// ...
Looper.prepareMain();
// 创建ActivityThread实例并调用其attach方法
// ...
Looper.loop(); // 开始消息循环
}

在子线程中,如果需要创建LooperMessageQueue,需要手动调用Looper.prepare()Looper.loop()方法:

new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare(); // 准备Looper和MessageQueue
// 创建Handler等操作...
Looper.loop(); // 开始消息循环
}
}).start();
创建Handler

在拥有Looper的线程中,可以创建Handler实例:

Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 处理消息
}
};

或者,如果你想要将Handler与特定的Looper关联,可以使用Handler(Looper looper)构造函数。

发送消息

使用Handler发送消息到消息队列:

Message message = Message.obtain(); // 获取Message对象
message.what = 1; // 设置消息标识
// ...设置其他消息属性
handler.sendMessage(message); // 发送消息

或者发送一个Runnable对象:

handler.post(new Runnable() {
@Override
public void run() {
// 执行任务
}
});
处理消息

HandlerhandleMessage方法中处理消息:

@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
// 处理消息what为1的情况
break;
// ...处理其他消息
}
}

或者,如果是通过post方法发送的Runnable对象,则直接在Runnablerun方法中执行任务。

消息循环

Looper.loop()方法会不断地从MessageQueue中取出消息,并调用相应的HandlerhandleMessage方法处理消息。这个过程会一直进行,直到调用Looper.quit()Looper.quitSafely()来终止消息循环。

总结

Android消息机制通过HandlerLooperMessageQueueMessage这四个核心组件实现了线程间的通信和异步操作。在Android开发中,利用消息机制可以有效地避免直接在UI线程中执行耗时操作,从而提升应用的响应性和用户体验。

消息队列实现原理

消息队列(MessageQueue)是Android消息机制中的一个核心组件,它本质上是一个单链表的数据结构,用于存储待处理的Message对象。每个Message对象都按照它们被添加到队列中的时间顺序排列。MessageQueue的主要职责是管理这些消息,并提供添加、获取和删除消息的方法。

添加消息:当通过Handler发送一个Message时,这个Message会被添加到MessageQueue的尾部。添加操作是线程安全的,确保在多线程环境下不会发生数据竞争。

获取消息Looper在其消息循环中不断地从MessageQueue中取出消息。这个取出操作是阻塞的,意味着如果没有消息可供处理,Looper会等待直到有消息被添加进来。一旦取到消息,Looper会调用相应的HandlerhandleMessage方法来处理这条消息。

消息屏障

消息屏障(Messagetarget属性为null的特殊消息)是一种用于控制消息处理顺序的机制。当向MessageQueue中添加一个消息屏障时,所有在这个屏障之后添加的消息都必须等待这个屏障被处理之后才能被取出和处理。消息屏障常常用于确保某些关键操作(如界面更新、动画帧回调等)能够按照预期的顺序执行,而不被其他非关键操作打断。

空闲机制

在Android消息机制中,当MessageQueue中没有消息可供处理时,Looper会进入空闲状态。此时,如果设置了空闲处理器(IdleHandler),Looper会调用这个处理器的queueIdle方法。空闲处理器通常用于执行一些在消息队列空闲时才需要进行的操作,比如清理资源、执行后台任务等。

开发者可以通过向MessageQueue添加IdleHandler来利用空闲机制。当MessageQueue变为空闲状态时,所有添加的IdleHandler会依次被调用。如果一个IdleHandler在处理完任务后返回false,表示不再需要继续被调用;如果返回true,则在下一次空闲时还会被调用。

空闲机制提供了一种有效的方式来优化应用的性能,特别是在没有用户交互或消息处理的空闲时段。通过合理地使用空闲处理器,开发者可以在不阻塞UI线程的情况下执行一些低优先级的任务,从而提升应用的响应性和用户体验。

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值