android消息处理笔记

本文深入解析了Android消息处理系统的三个核心组件:Handler、Looper和Message。详细介绍了它们的工作原理及如何实现消息的发送与处理。并通过示例展示了如何在实际应用中使用这些组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android消息处理系统
1.Handler
handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程), 它有两个作用: (1): 安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
mLooper---------Looper.myLooper()
mQueue----------mLooper.mQueue--------Looper::mQueue
//发送一个消息
sendMessage(Message msg){
msg.target = Handler.this;
mQueue.enqueueMessage(msg);
}
//接受一个消息进行处理
dispatchMessage(Message msg){
Handler.this.handleMessage(msg);
}

2.Looper
(1) Looper类别用来为一个线程开启一个消息循环。默认情况下Android中新诞生的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环) Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。
(2) 通常是通过Handler对象来与Looper交互的。Handler可看做是Looper的一个接口,用来向指定的Looper发送消息及定义处理方法。
开启消息循环调用如下
{
Looper.prepare() ; // or Looper.prepareMainLooper();
...
Looper.loop();
}
重要成员变量及函数:
ThreadLocal<Looper> sThreadLocal;
MessageQueue mQueue;
prepare(){
sThreadLocal.set(new Looper());
}
loop(){
Looper me = sThreadLocal.get();
while(1){
Message msg = mQueue.next();
msg.target.dispatchMessage(msg);
}
}
myLooper(){
return sThreadLocal.get();
}
3.Message
重要成员变量及函数
int what
int arg1;
int arg2;
Handler target;
Message next;
Object obj;
Message obtain(){
return new Message();
}
recycle(){...}

4.消息队列MessageQueue
重要成员变量及函数
Message mMessages;
ArrayList<IdleHandler> mIdleHandlers;
IdleHandler[] mPendingIdleHandlers;
Message next(){
//操纵mMessages;
}
enqueueMessage(Message msg){
//加入mMessage的头部或尾部
}
removeMessage(Message msg){...}
消息处理流程
1.Activity在启动时会通过ActivityThread调用Looper.prepareMainLooper()和Looper.loop()开启消息循环
发送一个消息
2.Handler.sendMessage(msg);
3.Handler::mQueue::enqueueMessage(msg);
即Looper::mQueue(msg);
消息被压入消息队列
4.在Looper::loop()中处理消息;
5.msg.dipatchMessage(msg);
5.Handler::handleMessage(msg);
eg:
xxxActivity extends Activity{
public static final int MSG_TEST = 101;
...
Handler mHandler = new Handelr(){
public void handleMessage(Message msg){
if(msg.what==MSG_TEST){
Log.v("xxxActivity", "get message MSG_TEST");
}
}
};
...
new Thread(){
public void run(){
Message msg = new Message();
msg.what = MSG_TEST;
Log.v("xxxActivity", "send message MSG_TEST in new thread");
mHandler.sendEmptyMessage(msg);
}
}.start();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值