br1*_*br1 4 android aidl android-binder
标有" oneway "关键字的AIDL方法和接口是远程进程的异步Binder调用,并且据说不保证调用的顺序.另一方面,Dianne Hackborn(Binder的作者)的最后评论( https://groups.google.com/forum/#!topic/android-developers/FFY-hg2Jx0M)说:
"交付顺序与目标对象相关联(因此您可以在不同的接口上接收不按顺序的呼叫)"
这似乎暗示,调用相同的接口保持他们的顺序.
任何人都可以澄清这个吗?
hac*_*bod 13
作为一般规则,单向调用是异步的,并且可以在不同的线程上同时调度而没有排序保证.但是,系统对在同一IBinder对象上发生的单向调用强加了特殊的排序保证:在这种情况下,将按原始调用的顺序一次调度一个事务.请注意,此排序仅适用于对同一IBinder对象进行单向调用的特定情况.其他任何东西 - 调用不同的IBinder对象或单向混合和同步调用 - 都不会给你任何订单保证.
这项工作的方式是在内核中每个IBinder对象都有一个单向事务队列来分派.单向呼叫会添加到该队列(非单向呼叫会绕过队列).当每个先前的事务完成时,一次一个地从一个队列中调度事务.因此,您可能会看到这些调用在不同的线程上调度,但系统确保一次只执行一个调用.(同样只针对单个IBinder对象,单向调用两个不同的IBinder对象可以同时执行.)
据我所知,Binder 中的所有事务都是同步的,这意味着客户端发起调用并等待服务器的回复。然而,在单向通信的情况下,服务器接收到这样的调用只是简单地返回,因此,这种类型的通信是单向的。
服务中的调用在不同的 Binder 线程中处理,因此,在同步通信的情况下,可以确保客户端在请求后会收到回复(因为客户端等待服务器的响应)。但是,在单向调用的情况下,来自客户端的请求可能会在不同的 Binder 线程中处理。这就是为什么,在我看来,没有定义顺序。