在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系

Message,信息的载体,用来传递数据给Handler。

Handler (Handler处理者,是 Message 的主要处理者,负责 Message 的发送,Message 内容的执行处理)
发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的 MessageQueue 相关联。
Handler和创建它的线程绑定在一起,把 Message和Runable 对象传递给 MessageQueue,这些对象离开 MessageQueue 时,Handler 负责执行他们。

Handler有两个主要的用途:
(1)确定在将来的某个时间点执行一个或者一些 Message和Runnable 对象。
(2)在其他线程(不是 Handler 绑定线程)中排入一些要执行的动作。

post(Runnable):Runnable 在 handler 绑定的线程上执行,也就是说不创建新线程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):

sendMessage这个动作把 Message对象排成队列,这些 Message对象包含一些信息,Handler的hanlerMessage(Message)会处理这些Message.
handlerMessage(Message)必须由 Handler 的子类来重写。

post 这个动作把 Runnable 对象排入 MessageQueue,MessageQueue 收到这些消息的时候以一定的排序执行他们

当 posting 或者 sending 到一个 Hanler 时,你可以有三种行为: 当 MessageQueue 准备好就处理,定义一个延迟时间,定义一个精确的时间去处理。后两者允许你实现 timeout,tick,和基于时间的行为。

创建一个新进程时,主线程自带一个MessageQueue,它管理顶层的应用对象和主线程创建的窗体。

MessageQueue:(Message Queue 消息队列,用来存放通过 Handler 发布的消息,按照先进先出执行。)
包含message列表的底层类,Looper负责分发这些message。message并不是直接加到MessageQueue中,而是通过MessageQueue.IdleHandler 关联到 Looper
可以通过 Looper.myQueue()从当前线程中获取 MessageQueue

每个 message queue 都会有一个对应的 Handler。Handler 会向 messagequeue 通过
两种方法发送消息:sendMessage 或 post。这两种消息都会插在 message queue 队尾并
按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过 sendMessage
发送的是一个 message 对象,会被 Handler 的 handleMessage()函数处理;而通过 post 方
法发送的是一个 runnable 对象,则会自己执行。

Looper:
Looper 类被用来执行一个线程中的 message循环。 在线程中调用 prepare()创建一个 Looper, 然后用 loop()来处理 messages, 直到循环终止。
(Looper 是 Handler 和消息队列之间通讯桥梁,程序组件首先通过 Handler 把消息传递给
Looper,Looper 把消息放入队列,它也可以取得MessageQueue里的消息,产生消息队列,传递给Handler)
大多数和 message loop 的交互是通过Handler。

下面是一个典型的带有 Looper 的线程实现。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}

转载于:https://www.cnblogs.com/jiuqing/p/4138757.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android开发,主线程(也被称为UI线程)负责处理与用户交互的操作,例如响应用户的点击事件、更新UI界面等。而子线程则是用于执行一些耗时的任务,比如网络请求、数据库操作等。 为了实现在子线程更新UI界面的需求,Android提供了Handler和Looper机制。Looper是一个负责循环消息队列的类,它负责从消息队列取出消息,然后将其分发给对应的Handler进行处理。 在子线程使用Looper来处理消息时,需要首先调用Looper.prepare()方法来准备Looper,然后调用Looper.loop()方法来循环处理消息,直到Looper.quit()被调用停止循环。在调用Looper.loop()之前,需要先创建一个Handler的实例,并将其与当前线程的Looper关联起来。这样,子线程的Looper才能将消息分发给相应的Handler进行处理。可以使用Handler的post()、sendMessage()等方法来向子线程的消息队列发送消息。 使用子线程的LooperHandler机制,可以实现在子线程更新UI界面的需求,避免在主线程执行耗时操作导致界面卡顿的问题。然而,需要注意的是,在子线程使用LooperHandler时要避免在UI界面的更新操作过于频繁,以免影响用户体验和性能。 总结一下,Android在子线程使用LooperHandler的目的是为了实现在子线程更新UI界面的需求,通过创建Looper实例并循环处理消息,将消息分发给对应的Handler进行处理。这样就能在子线程更新UI界面,提高程序的性能和用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值