为什么Android的Handler采用管道而不使用Binder?
1个回答
2016-05-06 · 知道合伙人互联网行家
关注
展开全部
首先Handler不见得使用管道 (pipe), 事实上, 在Android M中实际上使用了 eventfd. 不过这不关键.
要想比较好的理解为什么Handler使用管道而不是Binder, 我们可以从开发者的角度来思考一下: 在Looper中, 他要解决一个什么问题? 我自己本身不是很熟悉Looper这些概念, 粗粗看了下代码: 大约可以看成是消息循环(Message Loop)的样子吧. 其它线程发消息,Looper所在的线程接受并处理消息. 好吧, 开发者要解决的是一个生产者消费者问题. 一般说来对于生产者消费者问题我们需要考虑几个因素: buffer (用于存放"产品"的内存), 上锁 (保护对buffer的访问), 等待/唤醒:
1. 生产者和消费者在同一个进程内, 所以无需考虑共享内存问题
2. 上锁: posix mutex, 简单好用
3. 等待/唤醒: 在没有消息时, 消费者不能忙等, 而应该阻塞 (block) 直到新消息到来 -
这里的关键是3), 在Android/Linux中有很多方法可以用来等待/唤醒, 比如条件变量, Posix信号量 (Android不支持System V信号量), 消息队列, Unix socket , pipe, 甚至binder等等. 怎么选呢? Looper开发者的标准很可能是: 选较"轻"的. 于是他先选了pipe, 以后又发现eventfd更好 (很可能开发者不知道eventfd的存在, 毕竟eventfd还是比较新的系统调用).
要想比较好的理解为什么Handler使用管道而不是Binder, 我们可以从开发者的角度来思考一下: 在Looper中, 他要解决一个什么问题? 我自己本身不是很熟悉Looper这些概念, 粗粗看了下代码: 大约可以看成是消息循环(Message Loop)的样子吧. 其它线程发消息,Looper所在的线程接受并处理消息. 好吧, 开发者要解决的是一个生产者消费者问题. 一般说来对于生产者消费者问题我们需要考虑几个因素: buffer (用于存放"产品"的内存), 上锁 (保护对buffer的访问), 等待/唤醒:
1. 生产者和消费者在同一个进程内, 所以无需考虑共享内存问题
2. 上锁: posix mutex, 简单好用
3. 等待/唤醒: 在没有消息时, 消费者不能忙等, 而应该阻塞 (block) 直到新消息到来 -
这里的关键是3), 在Android/Linux中有很多方法可以用来等待/唤醒, 比如条件变量, Posix信号量 (Android不支持System V信号量), 消息队列, Unix socket , pipe, 甚至binder等等. 怎么选呢? Looper开发者的标准很可能是: 选较"轻"的. 于是他先选了pipe, 以后又发现eventfd更好 (很可能开发者不知道eventfd的存在, 毕竟eventfd还是比较新的系统调用).
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询