本節詳細介紹接口方法和錯誤。
作廢方法
不返回結果的方法被轉換為返回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()
請求服務的新實例,可以從此類故障中恢復。但是,此方法僅在崩潰的進程已重新啟動並使用 servicemanager 重新註冊其服務時才有效(這對於 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);