线程通信(2)
消息分发
当Message对象被发送到Handler,并尝试被处理时,Handler会对消息进行分发,即决定由谁处理消息。
在消息机制中,可以有以下3种处理消息的方式:
【高优先级】在创建Message对象时,调用Message类的静态方法public static Message obtain(Handler h,Runnable callback),
【中优先级】在创建Handler对象时,调用public Handler(Callback callback)构造方法,指定callback,将由Handler.Callback接口中
定义的public boolean handleMessage(Message msg)方法处理消息。
【低优先级】自定义类继承Handler类,创建自定义的Handler对象,并在自定义类中
重写public void handleMessage(Message msg)方法,由重写的方法处理消息。
线程通信模型
由于向目标线程发送消息的线程可能比较多,为了确保目标线程
能收到这些消息,并逐一处理,在消息机制中,存在4种角色:
Message:消息的载体
Handler:发送消息、处理消息
MessageQueue:消息队列
Looper:消息队列的管理者
Handler用于执行消息的发出和处理
Handler关联一个独立的线程及消息队列,即Handler在哪个线程创建,则绑定到哪个
线程的消息队列。
MessageQueue是Message的容器,它是一个先进先出、后进后出的队列;
任何Message在被发出后,都会被先放到MessageQueue中,然后逐一的发送给目标。
Looper是MessageQueue的管理者
当Message被发出后,由Looper关联的MessageQueue.IdleHandler将其添加到MessageQueue中
Looper在工作时,会循环读取MessageQueue,然后实现消息的发送
MessageQueue是由Looper实现管理,英雌,开发人员无需对它进行处理
Handler的创建线程决定了他所在的线程,则处理对应线程中收到的消息
每个线程都可以有独立的Looper,由各个Looper管理各个线程的消息队列
Looper必须调用prepare()系列方法进行初始化,然后在调用loop()方法才会开始工作
每个Handler在初始化之前,对应的线程中必须有匹配的Looepr,而主线程默认即存在已经启动的Looper
当Message对象被发送到Handler,并尝试被处理时,Handler会对消息进行分发,即决定由谁处理消息。
在消息机制中,可以有以下3种处理消息的方式:
【高优先级】在创建Message对象时,调用Message类的静态方法public static Message obtain(Handler h,Runnable callback),
指定callback参数,则由callback处理消息。
public void doSendMessage(View view){
Message msg;
Runnable callback = new Runnable(){
@Override
public void run() {
System.out.println("高优先级");
}
};
msg = Message.obtain(new Handler(),callback);
msg.sendToTarget();
}
【中优先级】在创建Handler对象时,调用public Handler(Callback callback)构造方法,指定callback,将由Handler.Callback接口中
定义的public boolean handleMessage(Message msg)方法处理消息。
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler(new InnerHandlerCallback());
}
private class InnerHandlerCallback implements Handler.Callback{
@Override
public boolean handleMessage(Message msg) {
System.out.println("中优先级");
return false;
}
}
public void doSendMessage(View view){
Message msg;
Runnable callback = new Runnable(){
@Override
public void run() {
System.out.println("高优先级");
}
};
msg = Message.obtain(handler);
msg.sendToTarget();
}
【低优先级】自定义类继承Handler类,创建自定义的Handler对象,并在自定义类中
重写public void handleMessage(Message msg)方法,由重写的方法处理消息。
线程通信模型
由于向目标线程发送消息的线程可能比较多,为了确保目标线程
能收到这些消息,并逐一处理,在消息机制中,存在4种角色:
Message:消息的载体
Handler:发送消息、处理消息
MessageQueue:消息队列
Looper:消息队列的管理者
Handler用于执行消息的发出和处理
Handler关联一个独立的线程及消息队列,即Handler在哪个线程创建,则绑定到哪个
线程的消息队列。
MessageQueue是Message的容器,它是一个先进先出、后进后出的队列;
任何Message在被发出后,都会被先放到MessageQueue中,然后逐一的发送给目标。
Looper是MessageQueue的管理者
当Message被发出后,由Looper关联的MessageQueue.IdleHandler将其添加到MessageQueue中
Looper在工作时,会循环读取MessageQueue,然后实现消息的发送
MessageQueue是由Looper实现管理,英雌,开发人员无需对它进行处理
Handler的创建线程决定了他所在的线程,则处理对应线程中收到的消息
每个线程都可以有独立的Looper,由各个Looper管理各个线程的消息队列
Looper必须调用prepare()系列方法进行初始化,然后在调用loop()方法才会开始工作
每个Handler在初始化之前,对应的线程中必须有匹配的Looepr,而主线程默认即存在已经启动的Looper
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理