介面方法&錯誤

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

無效方法

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