Sendmessage函数

博主寻求高手指导,希望了解如何通过sendmessage函数来修改textbox的text属性,聚焦于信息技术中函数使用及控件属性修改问题。

请高手指导下,如何透过sendmessage 函数 修改 textbox的text属性。

 

# sendMessage函数详解 ## 题目重述 请详细解释Android中`Handler`的`sendMessage`函数的工作原理、调用流程及其底层实现机制。 --- ## 详解 ### 一、sendMessage函数概述 `sendMessage`是`Handler`类中最常用的发送消息方法之一,用于将一个`Message`对象发送到消息队列中,待Looper处理时回调对应的`handleMessage`方法。它实现了跨线程通信的核心功能。 ```java public final boolean sendMessage(Message msg) { return sendMessageDelayed(msg, 0); } ``` 这是最基础的调用入口,实际最终会调用到`sendMessageAtTime`方法。 --- ### 二、完整调用链分析 #### 1. `sendMessage` → `sendMessageDelayed` ```java public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); } ``` - `delayMillis`表示延迟时间(毫秒)。 - 基于系统启动时间(不包括休眠时间)计算目标执行时间`uptimeMillis()`。 #### 2. `sendMessageAtTime` 设置执行时间 ```java public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue; if (queue == null) { RuntimeException e = new RuntimeException( this + " sendMessageAtTime() called with no mQueue"); return false; } return enqueueMessage(queue, msg, uptimeMillis); } ``` - 检查`MessageQueue`是否存在。 - 调用私有方法`enqueueMessage`将消息入队。 #### 3. `enqueueMessage` 绑定目标并入队 ```java private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; // 关键:将Message的target指向当前Handler msg.markInUse(); return queue.enqueueMessage(msg, uptimeMillis); } ``` - `msg.target = this`:确保Looper取出消息后能准确回调到该Handler。 - 调用`MessageQueue.enqueueMessage()`完成入队操作。 --- ### 三、关键点说明 #### 1. 消息的时间排序机制 消息被插入`MessageQueue`时,根据`msg.when`(即`uptimeMillis`)进行排序: ```java if (p == null || when == 0 || when < p.when) { // 插入头部 msg.next = p; mMessages = msg; } else { // 遍历链表找到合适位置插入 Message prev; for (;;) { prev = p; p = p.next; if (p == null || when < p.when) { break; } } msg.next = p; prev.next = msg; } ``` 这保证了即使先发送一个延迟5秒的消息,再发送一个立即执行的消息,后者仍会优先处理。 #### 2. 线程安全性 整个入队过程在`MessageQueue`内部加了`synchronized`锁,确保多线程环境下消息插入的原子性。 ```java synchronized (this) { // 入队逻辑 } ``` #### 3. 阻塞与唤醒机制 - 如果新插入的消息是队列中最早的(`when < head.when`),且当前线程正在阻塞等待,则需要唤醒: ```java if (needWake) { nativeWake(mPtr); } ``` - 底层通过Linux的`epoll`机制实现高效唤醒,避免忙等待。 --- ### 四、使用示例 ```java Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: textView.setText("Message received!"); break; } } }; // 发送消息 Message msg = Message.obtain(); msg.what = 1; handler.sendMessage(msg); // 立即发送 // 或 handler.sendMessageDelayed(msg, 1000); // 延迟1秒 ``` --- ### 五、与其他发送方法的关系 | 方法 | 说明 | |------|------| | `sendEmptyMessage(int what)` | 发送只带`what`值的空消息 | | `sendMessageDelayed(Message, long)` | 延迟发送 | | `sendMessageAtTime(Message, long)` | 指定绝对时间发送 | | `post(Runnable)` | 发送Runnable任务(封装为Message) | 它们最终都归结为`sendMessageAtTime`。 --- ## 知识点 ### 1. 消息时间戳机制 `uptimeMillis`表示系统启动后的毫秒数,用于确定消息执行顺序,不受系统休眠影响。 ### 2. 目标Handler绑定 `msg.target = this`确保消息能正确回传给发送它的Handler,实现精准回调。 ### 3. 同步与唤醒机制 利用`synchronized`加锁和`nativeWake`唤醒阻塞线程,保障高并发下的线程安全与效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值