介面方法和錯誤

本節將詳細說明介面方法和錯誤。

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);