本節將詳細說明介面方法和錯誤。
無效方法
不會傳回結果的方法會轉譯為傳回 void
的 Java 方法。例如 HIDL 宣告:
doThisWith(float param);
… 會變成:
void doThisWith(float param);
單一結果方法
傳回單一結果的方法會轉譯為 Java 等價項目,也傳回單一結果。例如:
doQuiteABit(int32_t a, int64_t b, float c, double d) generates (double something);
… 會變成:
double doQuiteABit(int a, long b, float c, double d);
多個結果方法
對於每個傳回多個結果的方法,系統都會產生回呼類別,在其 onValues
方法中提供所有結果。該回呼會做為方法的額外參數。例如:
oneProducesTwoThings(SomeEnum x) generates (double a, double b);
… 會變成:
public interface oneProducesTwoThingsCallback { public void onValues(double a, double b); } void oneProducesTwoThings(byte x, oneProducesTwoThingsCallback cb);
oneProducesTwoThings()
的呼叫端通常會使用匿名內部類別或 lambda 在本機實作回呼:
someInstanceOfFoo.oneProducesTwoThings( 5 /* x */, new IFoo.oneProducesTwoThingsCallback() { @Override void onValues(double a, double b) { // do something interesting with a and b. ... }});
或:
someInstanceOfFoo.oneProducesTwoThings(5 /* x */, (a, b) -> a > 3.0 ? f(a, b) : g(a, b)));
您也可以定義要用於回呼的類別,
class MyCallback implements oneProducesTwoThingsCallback { public void onValues(double a, double b) { // do something interesting with a and b. } }
… 並將 MyCallback
例項做為 oneProducesTwoThings()
的第三個參數傳遞。
傳輸錯誤和死亡收件者
由於服務實作項目可以在不同的程序中執行,因此在某些情況下,即使實作介面的程序終止,用戶端仍可保持運作。對已終止程序中代管的介面物件呼叫會失敗,並傳回傳輸錯誤 (呼叫方法擲回的執行階段例外狀況)。您可以透過呼叫 I<InterfaceName>.getService()
要求服務的新例項,從這類失敗中復原。不過,只有在發生當機的程序已重新啟動,並重新向服務管理員註冊服務時,這個方法才會生效 (對於 HAL 實作通常是如此)。
介面的用戶端也可以註冊死亡接收者,在服務終止時收到通知。如果在伺服器停止運作時發出呼叫,仍可能發生傳輸錯誤。如要在擷取的 IFoo
介面上註冊這類通知,用戶端可以執行下列操作:
foo.linkToDeath(recipient, 1481 /* cookie */);
recipient
參數必須是 HIDL 提供的介面 HwBinder.DeathRecipient
的實作項目。這個介面包含單一方法 serviceDied()
,當託管介面的程序終止時,系統會呼叫這個方法。
final class DeathRecipient implements HwBinder.DeathRecipient { @Override public void serviceDied(long cookie) { // Deal with service going away } }
cookie
參數包含透過呼叫 linkToDeath()
傳遞的 Cookie。您也可以在註冊死亡事件收件人後,使用以下方式取消註冊:
foo.unlinkToDeath(recipient);