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
.
Dzięki. To był rodzaj zmartwienia, o który się martwiłem. –
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. –