2010-06-14 8 views
5

Projektuję framework dla aplikacji klient/serwer dla telefonów z systemem Android. Jestem dość nowy zarówno w Javie, jak i Androidzie (ale nie jest to nowość w programowaniu, a w szczególności w programowaniu gwintowym).Czy jednorazowa deklaracja w Androidzie .aidl gwarantuje, że metoda zostanie wywołana w osobnym wątku?

Czasami mój serwer i klient będą w tym samym procesie, a czasami będą w różnych procesach, w zależności od dokładnego przypadku użycia. Interfejsy klienta i serwera wyglądać tak:

IServer.aidl:

package com.my.application; 

interface IServer { 

    /** 
    * Register client callback object 
    */ 
    void registerCallback(in IClient callbackObject); 

    /** 
    * Do something and report back 
    */ 
    void doSomething(in String what); 
    . 
    . 
    . 
} 

IClient.aidl:

package com.my.application; 

oneway interface IClient { 

    /** 
    * Receive an answer 
    */ 
    void reportBack(in String answer); 
    . 
    . 
    . 
} 

Teraz tutaj jest, gdy robi się ciekawie. Mogę przewidzieć przypadki użycia, w których klient dzwoni pod numer IServer.doSomething(), który z kolei wywołuje IClient.reportBack(), a na podstawie tego, co jest zgłaszane, IClient.reportBack() musi wysłać kolejne połączenie pod numer IClient.doSomething().

Problem polega na tym, że IServer.doSomething() nie będzie na ogół stały. To jest w porządku, o ile IClient.reportBack() jest zawsze wywoływany w nowym wątku. W takim przypadku mogę upewnić się, że implementacja IServer.doSomething() jest zawsze odpowiednio synchronized, aby wywołanie z nowego wątku blokowało do czasu pierwszego połączenia.

Jeśli wszystko działa tak, jak myślę, wtedy deklarując interfejs użytkownika jako oneway, gwarantuję, że tak będzie. Przynajmniej nie mogę myśleć o tym, że wywołanie z IServer.doSomething() do IClient.reportBack() może natychmiast powrócić (co powinno zapewnić oneway), ale IClient.reportBack nadal może ponownie wywołać IServer.doSomething rekursywnie w tym samym wątku. Musi zostać uruchomiony nowy wątek w IServer lub stary wątek IServer może zostać ponownie użyty do wewnętrznego wywołania funkcji IServer.doSomething(), ale dopiero po zwróceniu zewnętrznego wywołania do IServer.doSomething().

Moje pytanie brzmi, czy wszystko działa tak, jak sądzę? Dokumentacja systemu Android prawie nie wspomina o interfejsach oneway.

Odpowiedz

14

Słowo kluczowe jednokierunkowe oznacza, że ​​jeśli to wywołanie powoduje IPC (tj. Wywołujący i wywołujący znajdują się w różnych procesach), wówczas proces wywołujący nie czeka na wezwany proces do obsługi IPC. Jeśli nie spowoduje to IPC (tj. Obaj będą w tym samym procesie), połączenie będzie synchroniczne. To niefortunny szczegół, który znacznie upraszcza implementację bindera IPC. Jeśli są w tym samym procesie, wywołanie to zwykłe wywołanie metody Java.

+0

Dzięki. To był rodzaj zmartwienia, o który się martwiłem. –

+2

Zbudowałem aplikację testową i potwierdziłem, że masz rację. Wywołane z innego procesu zachowanie jest tak udokumentowane - wywołanie metody w interfejsie onway jest asynchroniczne - ale po wywołaniu z tego samego procesu wywołanie jest synchroniczne. –

Powiązane problemy