欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 在 Android 的`Handler` 和 `Binder

在 Android 的`Handler` 和 `Binder

2025/5/19 17:09:15 来源:https://blog.csdn.net/weixin_42283818/article/details/147949699  浏览:    关键词:在 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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词