本節將詳細說明介面方法和錯誤。
Void 方法
未傳回結果的方法會轉譯為 Java 方法
傳回 void
。舉例來說,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()
的呼叫您也可以取消註冊死亡事件
使用以下登錄器註冊成功:
foo.unlinkToDeath(recipient);