4

带有“ oneway ”关键字的AIDL方法和接口是对远程进程的异步Binder调用,据说不保证调用的顺序。另一方面,Dianne Hackborn(Binder 的作者)在此线程( https://groups.google.com/forum/#!topic/android-developers/FFY-hg2Jx0M)中的最后一条评论说:

“交付顺序与目标对象相关联(因此您可以在不同的接口上无序地接收调用)”

这似乎表明,对同一接口的调用保持了它们的顺序。

任何人都可以澄清这一点吗?

4

3 回答 3

14

作为一般规则,单向调用是异步的,可以同时在不同的线程上分派,没有顺序保证。但是,系统对同一IBinder对象上发生的单向调用施加了特殊的顺序保证:在这种情况下,事务将按照原始调用的顺序一次调度一个。请注意,此排序适用于对同一IBinder对象进行单向调用的特定情况。其他任何事情——对不同IBinder对象的调用或混合单向和同步调用——都不会为您提供它们之间的任何排序保证。

这项工作的方式是,在内核中,每个IBinder对象都有一个单向事务队列要分派。单向呼叫添加到该队列(非单向呼叫绕过队列)。当每个先前的事务完成时,事务一次从队列中分派出去。因此,您可能会看到这些调用在不同的线程上分派,但系统会确保一次只执行一个。(同样只针对单个IBinder对象,对两个不同IBinder对象的单向调用可以同时执行。)

于 2017-08-01T00:22:02.413 回答
0

据我记得,Binder 中的所有事务都是同步的,这意味着客户端发起调用并等待来自服务器的回复。但是,在单向通信的情况下,接收到这样的调用的服务器只是简单地返回,因此,这种类型的通信是单向的。

服务中的调用在不同的 Binder 线程中处理,因此,在同步通信的情况下,您可以确定客户端会在请求后收到回复(因为客户端等待来自服务器的响应)。但是,在单向调用的情况下,您来自客户端的请求可能会在不同的 Binder 线程中处理。这就是为什么,在我看来,没有定义顺序。

于 2014-04-01T11:02:01.477 回答
0

默认情况下,AIDL 调用是同步的,这意味着客户端将处于等待状态,直到方法返回,但如果我们使用“oneway”关键字,则方法调用是异步的,即立即返回,客户端稍后会收到回调。因此,排序不是为回调定义。

于 2017-07-04T13:05:17.830 回答