接口方法和錯誤

本節詳細介紹接口方法和錯誤。

作廢方法

不返回結果的方法被轉換為返回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);