当前位置: 首页 > news >正文

Android之Handler的post方法和sendMessage的区别

目录

  • post 方法
    • 方法
    • 特点
  • sendMessage 方法
    • 方法
    • 特点
  • 使用场景
  • 区别总结

Handler 类在 Android 中用于在不同线程之间传递消息和执行代码。它提供了两种主要的方式来执行任务:通过 post 方法和通过 sendMessage 方法。这两种方法有不同的使用场景和特点。

post 方法

方法

  • post(Runnable r)
  • postDelayed(Runnable r, long delayMillis)
  • postAtTime(Runnable r, long uptimeMillis)
Handler handler = new Handler(Looper.getMainLooper());// 立即执行
handler.post(new Runnable() {@Overridepublic void run() {// 在主线程中执行的代码Log.d("Handler", "Runnable executed");}
});// 延迟执行
handler.postDelayed(new Runnable() {@Overridepublic void run() {// 在主线程中执行的代码Log.d("Handler", "Runnable executed after delay");}
}, 2000); // 延迟2秒

特点

  • 直接执行代码:Runnable 直接包含要执行的代码块,不需要额外的封装。
  • 简单易用:对于简单的任务,使用 Runnable 更加直观和简洁。
  • 不需要消息传递:Runnable 不涉及消息的创建和处理,直接将代码提交给 Handler 执行。
  • 适用于直接执行任务:post 方法适用于需要在特定线程(通常是主线程)上执行任务的场景。

sendMessage 方法

方法

  • sendMessage(Message msg)
  • sendMessageDelayed(Message msg, long delayMillis)
  • sendMessageAtTime(Message msg, long uptimeMillis)
Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:// 处理消息1Log.d("Handler", "Message 1 received");break;case 2:// 处理消息2Log.d("Handler", "Message 2 received");break;default:super.handleMessage(msg);}}
};// 创建消息
Message message = handler.obtainMessage(1);
handler.sendMessage(message);// 延迟发送消息
Message delayedMessage = handler.obtainMessage(2);
handler.sendMessageDelayed(delayedMessage, 2000); // 延迟2秒

特点

  • 消息传递:Message 允许在不同线程之间传递数据。可以通过 Message 的 what、arg1、arg2 和 obj 字段传递不同类型的数据。
  • 灵活性:Message 适用于需要传递复杂数据或需要区分多种任务的场景。
  • 需要处理消息:需要在 Handler 的 handleMessage 方法中处理接收到的消息。
  • 适用于复杂任务:sendMessage 方法适用于需要传递数据并在接收端进行处理的场景。

使用场景

  • post 方法 适用于简单的任务,例如在主线程中更新 UI,不需要传递复杂数据。
  • sendMessage 方法 适用于需要在不同线程之间传递数据,或需要区分和处理多种任务的场景

区别总结

在这里插入图片描述

Android 之 Handler
HandlerThread 和 Handler 区别
Android之Handler是如何保证延迟发送的


http://www.mrgr.cn/news/19095.html

相关文章:

  • 【Linux操作系统】:Linux生产者消费者模型
  • 大二暑假去龙旗科技(上海)做了两个月软件测试实习生,讲讲我的经历和感受
  • 【2024】Datawhale X 李宏毅苹果书 AI夏令营 Task3
  • ssh安装
  • 华为OD机试 - 最长方连续方波信号(Java 2024 E卷 100分)
  • [SDK]-按钮静态文本与编辑框控件
  • C#中的Array.Sort()和Reverse()
  • 批量修改海量cad文件名——vba实现
  • 宝藏!《联盟现代控制特训班题库》(麒麟篇) 习题部分:甄选内容
  • 将泛型和函数式编程结合,竟然会让代码这么优雅!
  • 数据访问:JPA关联MyBatis
  • 【MySQL00】【 杂七杂八】
  • 【C++11(一)之入门基础)】
  • 使用UniApp实现自定义音乐播放器组件封装(简单轻量级,完美支持H5/小程序/Android)
  • 数字孪生:现状、挑战与未来
  • 牛客周赛 Round 58
  • hackme靶机通关攻略
  • pikachu文件包含漏洞靶场(本地文件包含+远程文件包含关卡)
  • ​yum安装/更新时报错:SyntaxError: invalid syntax​
  • Linux学习-虚拟化平台安装和使用