Ta sekcja zawiera szczegółowe informacje o metodach i błędach interfejsu.
Nieważne metody
Metody, które nie zwracają wyników, są przekładane na metody Java, które
zwróć void
. Na przykład deklaracja HIDL:
doThisWith(float param);
... staje się:
void doThisWith(float param);
Metody oparte na pojedynczym wyniku
Metody zwracające pojedynczy wynik są przekładane na ich język Java zwracają też pojedynczy wynik. Na przykład:
doQuiteABit(int32_t a, int64_t b, float c, double d) generates (double something);
... staje się:
double doQuiteABit(int a, long b, float c, double d);
Metody z wieloma wynikami
W przypadku każdej metody, która zwraca więcej niż 1 wynik, klasa wywołania zwrotnego ma postać
, który dostarcza wszystkie wyniki w swojej metodzie onValues
.
To wywołanie zwrotne jest dodatkowym parametrem metody. Na przykład parametr
:
oneProducesTwoThings(SomeEnum x) generates (double a, double b);
... staje się:
public interface oneProducesTwoThingsCallback { public void onValues(double a, double b); } void oneProducesTwoThings(byte x, oneProducesTwoThingsCallback cb);
Osoba dzwoniąca pod numerem oneProducesTwoThings()
zwykle użyje
anonimowej klasy wewnętrznej lub lambda, aby zaimplementować wywołanie zwrotne lokalnie:
someInstanceOfFoo.oneProducesTwoThings( 5 /* x */, new IFoo.oneProducesTwoThingsCallback() { @Override void onValues(double a, double b) { // do something interesting with a and b. ... }});
lub:
someInstanceOfFoo.oneProducesTwoThings(5 /* x */, (a, b) -> a > 3.0 ? f(a, b) : g(a, b)));
Możesz też zdefiniować klasę, która zostanie użyta jako wywołanie zwrotne...
class MyCallback implements oneProducesTwoThingsCallback { public void onValues(double a, double b) { // do something interesting with a and b. } }
...i przekazać wystąpienie MyCallback
jako trzeciego parametru do
oneProducesTwoThings()
Błędy transportowe i odbiorcy śmierci
W niektórych przypadkach implementacje usług mogą działać w innym procesie,
klient może przetrwać, nawet jeśli proces wdrażania interfejsu się kończy.
Wywołania obiektu interfejsu hostowanego w martwym procesie kończą się niepowodzeniem z użyciem transportu
(wyjątek środowiska wykonawczego zgłoszony przez wywoływaną metodę). Działania naprawcze po
może wystąpić błąd przez żądanie nowej instancji usługi przez wywołanie metody
I<InterfaceName>.getService()
Metoda ta działa jednak
tylko wtedy, gdy proces, który uległ awarii, został ponownie uruchomiony i ponownie zarejestrował usługi
z menedżerem usługi (co zazwyczaj odnosi się do implementacji HAL).
Klienci interfejsu mogą także zarejestrować odbiorcę śmierci, aby otrzymać
powiadomienia o śmierci usługi. Błędy transportu mogą nadal występować, jeśli połączenie
w chwili, gdy serwer umiera. Aby zarejestrować takie powiadomienia po pobraniu
IFoo
, klient może wykonać te czynności:
foo.linkToDeath(recipient, 1481 /* cookie */);
Parametr recipient
musi być implementacją funkcji
HwBinder.DeathRecipient
interfejsu HIDL. Interfejs
zawiera jedną metodę serviceDied()
, która jest wywoływana, gdy
gdy proces hostowania interfejsu się kończy.
final class DeathRecipient implements HwBinder.DeathRecipient { @Override public void serviceDied(long cookie) { // Deal with service going away } }
Parametr cookie
zawiera plik cookie, który został przekazany z
połączenie z numerem linkToDeath()
. Możesz też wyrejestrować zgon
odbiorcy po zarejestrowaniu go za pomocą:
foo.unlinkToDeath(recipient);