IPC(六)—一张图解释Messenger的设计思想

Aidl和Messanger是Android 中常用的IPC方式。首先,Aidl内部是基于Binder的,而Messenger内部又是基于Aidl的。但是messenger和Aidl还是有所区别的。
学习Aidl的时候常会看到:
“Using AIDL is necessary only if you allow clients from different applications to access your service for IPC and want to handle multithreading in your service.”
而学习Messenger的时候:
“if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger.”
从这两句话可以看出Messenger和Aidl的最大区别在于多线程处理方面,事实上正是如此。
首先是Aidl的执行过程。
AIdl执行过程
上图中ct代表客户端线程,bt代表BinderDriver线程。
首先是ct通过transact发送数据给BinderDriver,然后由bt线程去执行server端的方法。如果此时客户端有多个线程,那么BinderDriver 就会产生bt2,bt3…等等线程来执行Server端方法。此时线程是不同步的。
而Messenger恰恰就解决了线程同步的问题,那么是怎么解决的呢?

Messenger
bt线程在执行的时候,调用handler.sendmessage方法发送消息到server端的MessageQueue中,然后server端的ActivityThread就去循环执行MessageQueue中的方法。尽管会有bt1,bt2…由于bt线程只是负责发送消息到server端的MessageQueue中,而server端的ActivityThread负责逐一取出MessageQueue中的消息来逐一执行。因此,多线程模型就编程单线程模型了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值