介面方法和錯誤

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

無效方法

不會傳回結果的方法會轉譯為傳回 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);