本節詳細介紹介面方法和錯誤。
無效方法
不傳回結果的方法將轉換為傳回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);