2013-12-13 30 views
1

標記爲「單向」關鍵字的AIDL方法和接口是異步Binder調用遠程進程,並且據說不能保證調用的排序。在另一方面,戴安娜Hackborn(粘合劑的作者)在此線程( https://groups.google.com/forum/#!topic/android-developers/FFY-hg2Jx0M)最後評論說:AIDL「單向」遠程呼叫的訂購保證是什麼?

「交付的訂貨是聯繫在一起的目標物體(這樣你就可以得到不同的 電話接口不按順序)「

這似乎表明,調用相同的接口保持其順序。

任何人都可以澄清這一點?

回答

0

至於我記得,活頁夾中的所有交易都是同步的,這意味着客戶端發起呼叫,並等待來自服務器的答覆。但是,在單向通信的情況下,服務器收到這樣的通話只是返回,因此這種通信是單向的。

服務中的調用在不同的Binder線程中處理,因此,在同步通信的情況下,您可以確保客戶端將在請求後收到答覆(因爲客戶端等待來自服務器的響應)。但是,在單向調用的情況下,您的客戶請求可能會在不同的Binder線程中處理。這就是爲什麼,就我而言,寫下訂單沒有定義。

0

默認情況下,AIDL調用是同步的,這意味着客戶端將處於等待狀態,直到方法返回,但如果我們使用「oneway」關鍵字,則方法調用是異步的,即它立即返回並且客戶端稍後會接收回調。訂購沒有爲回調定義。

10

一般而言,單向調用是異步的,並且可以在不同的線程同時沒有排序保證調度。但是,系統對同一個IBinder對象上發生的正在進行的通話施加特殊的訂單保證:在這種情況下,按照原始通話的順序,一次發送一筆交易。請注意,這個排序適用於相同的IBinder對象上調用單向的具體情況。其他任何 - 呼叫不同的IBinder對象或單向混音和同步呼叫 - 不會給你任何訂單保證。

這項工作是在內核中的每個對象的IBinder具有單向交易的隊列調度方式。單向呼叫添加到該隊列(非單向呼叫繞過隊列)。隨着每個以前的交易完成,交易將一次從隊列中分派出去。所以你可能會看到這些調用被分派到不同的線程上,但是系統一次只能確保一個正在執行。 (同樣僅適用於單個的IBinder對象,在兩個不同的IBinder對象單向通話可以同時執行。)

+1

另外值得一提的是,對對象流程中的本地製成單向呼叫作爲普通方法調用操作並且_not_異步。 – jham