Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AIDL的订购保证是什么;单向“;远程通话?_Android_Aidl_Android Binder - Fatal编程技术网

Android AIDL的订购保证是什么;单向“;远程通话?

Android AIDL的订购保证是什么;单向“;远程通话?,android,aidl,android-binder,Android,Aidl,Android Binder,标有“oneway”关键字的AIDL方法和接口是用于远程进程的异步绑定器调用,据说调用的顺序不保证。另一方面,Dianne Hackborn(Binder的作者)在这篇文章中的最后一条评论( )说: “交付的顺序与目标对象相关联(因此您可以在不同的时间接收呼叫 接口故障“ 这似乎表明,对同一接口的调用保持其顺序 有人能澄清这一点吗?据我所知,Binder中的所有事务都是同步的,这意味着客户端发起呼叫并等待服务器的回复。然而,在单向通信的情况下,接收到这种调用的服务器只是返回,因此,这种类型的通信

标有“oneway”关键字的AIDL方法和接口是用于远程进程的异步绑定器调用,据说调用的顺序不保证。另一方面,Dianne Hackborn(Binder的作者)在这篇文章中的最后一条评论( )说:

“交付的顺序与目标对象相关联(因此您可以在不同的时间接收呼叫 接口故障“

这似乎表明,对同一接口的调用保持其顺序


有人能澄清这一点吗?

据我所知,Binder中的所有事务都是同步的,这意味着客户端发起呼叫并等待服务器的回复。然而,在单向通信的情况下,接收到这种调用的服务器只是返回,因此,这种类型的通信是单向的


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

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

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


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

还值得注意的是,对流程中本地对象的单向调用与普通方法调用一样运行,并且不是异步的。