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

在 Android 的`Handler` 和 `Binder

在 Android 开发中,HandlerBinder 是两个核心概念,分别用于不同场景的线程通信和跨进程通信(IPC)。以下是它们的主要区别:

1. 核心功能

HandlerBinder
用于线程间通信(同一进程内)用于跨进程通信(IPC,不同进程间)
主要解决 UI 线程不能直接处理耗时操作的问题实现不同进程间的对象方法调用和数据共享
基于消息队列(MessageQueue)和 Looper 机制基于 Linux 内核的 Binder 驱动

2. 工作原理

Handler
  • 消息队列(MessageQueue):存储待处理的消息(Message)。
  • Looper:循环从消息队列中取出消息,并分发给对应的 Handler。
  • Handler:发送消息(sendMessage())和处理消息(handleMessage())。

示例流程

  1. 子线程通过 Handler 发送消息到主线程的消息队列。
  2. 主线程的 Looper 取出消息,调用 Handler 的 handleMessage() 方法更新 UI。
Binder
  • C/S 架构:客户端(Client)通过 Binder 调用服务端(Server)的方法。
  • Binder 驱动:内核层实现进程间内存映射和数据传输。
  • IBinder 接口:所有 Binder 对象必须实现的接口,定义跨进程方法调用的规范。

示例流程

  1. 服务端(如 SystemServer)注册 Binder 服务。
  2. 客户端通过 ServiceManager 获取服务的 Binder 引用。
  3. 客户端调用 Binder 代理对象的方法,数据通过 Binder 驱动传输到服务端。

3. 使用场景

Handler
  • 更新 UI(例如在子线程中完成网络请求后刷新界面)。
  • 定时任务(通过 postDelayed() 实现)。
  • 异步任务的回调处理。

示例代码

// 在主线程创建 Handler
Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {// 更新 UItextView.setText("更新后内容");}
};// 在子线程发送消息
new Thread(() -> {// 耗时操作handler.sendEmptyMessage(0);
}).start();
Binder
  • 系统服务调用(如 ActivityManager、WindowManager)。
  • 自定义跨进程服务(如音乐播放器服务)。
  • ContentProvider(基于 Binder 实现)。

示例代码

// 定义 AIDL 接口(如 IMyService.aidl)
interface IMyService {int add(int a, int b);
}// 服务端实现 Binder
public class MyService extends Service {private final IMyService.Stub binder = new IMyService.Stub() {@Overridepublic int add(int a, int b) {return a + b;}};@Overridepublic IBinder onBind(Intent intent) {return binder;}
}// 客户端调用
ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {IMyService myService = IMyService.Stub.asInterface(service);int result = myService.add(1, 2);}
};

4. 性能对比

维度HandlerBinder
开销低(线程间消息传递)高(涉及内核态切换和数据拷贝)
延迟毫秒级百微秒级(跨进程时)
适用数据量小(消息携带少量数据)中等(单次传输上限约 1MB)

5. 核心区别总结

对比项HandlerBinder
通信范围同一进程内的线程间不同进程间
实现机制消息队列 + LooperLinux Binder 驱动 + AIDL
核心类Handler, Message, LooperIBinder, Service, AIDL
典型场景更新 UI、异步任务系统服务调用、自定义 IPC
http://www.xdnf.cn/news/6161.html

相关文章:

  • 学前数学思维:等量代换
  • 多因子线性回归实战
  • fiftyone-dataset使用基础
  • 零基础学Java——终章:核心知识点与面试总结
  • Vue百日学习计划Day4-8——Gemini版
  • 从 Vue3 回望 Vue2:逻辑复用新思维——从 Mixins 到 Composables
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的智能零售柜技术方案
  • 「数学::博弈论」Nim游戏(尼姆游戏)/ Luogu P2197(C++)
  • 高压启动电路--学习记录
  • 反向操作:如何用AI检测工具优化自己的论文“人味”?
  • Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器
  • 小白月赛——命运之弹
  • python:mitmproxy代理服务搭建
  • C——俄罗斯方块
  • Android 适配之——targetSdkVersion 30升级到31-34需要注意些什么?
  • 使用spring ai实现简单会话
  • PHP 编程:现代 Web 开发的基石与演进
  • 基于EMD-PCA-LSTM的光伏功率预测模型研究
  • 京东回应外卖业务中期目标:聚焦协同与体验,布局长远发展
  • 洞若观火 - 服务网格的可观测性魔法 (Istio 实例)
  • 第二十八节:直方图处理- 直方图计算与绘制
  • 使用termius连接腾讯云服务器
  • 使用Docker部署MongoDB
  • 实验五:以太网UDP全协议栈的实现(通过远程实验系统)
  • Milvus 视角看重排序模型(Rerankers)
  • 说说C/C++结构体大小计算(内存对齐)
  • 【MyBatis-9】MyBatis分页插件PageHelper深度解析与实践指南
  • 朱老师,3518e系列,第二季
  • (3)python开发经验
  • nacos:服务注册原理