インターフェースのメソッドとエラー

このセクションでは、インターフェースのメソッドとエラーについて説明します。

void メソッド

結果を返さないメソッドは、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() の呼び出し元では、通常は匿名の内部クラスまたはラムダ式を使用してコールバックをローカルで実装します。

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() の 3 番目のパラメータとして渡すこともできます。

トランスポート エラーと終了通知受信者

サービス実装は別のプロセスで実行することが可能です。そのため、インターフェースを実装するプロセスが終了しても、クライアントが実行されたままになる場合があります。インターフェース オブジェクトが終了したプロセス内でホストされている場合、そのオブジェクト上での呼び出しは、トランスポート エラーで失敗します(呼び出されたメソッドからランタイムの例外がスローされます)。失敗した状態を元に戻すには、I<InterfaceName>.getService() を呼び出してサービスの新しいインスタンスをリクエストします。ただし、この方法が機能するのは、失敗したプロセスを再起動してサービスを ServiceManager に再登録した場合のみです(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);