인터페이스 메서드 & 오류

이 섹션에서는 인터페이스 메서드 및 오류에 대해 자세히 설명합니다.

void 메서드

결과를 반환하지 않는 메서드는 void를 반환하는 자바 메서드로 변환됩니다. 예를 들어 HIDL 선언은 다음과 같습니다.

doThisWith(float param);

다음과 같이 변환됩니다.

void doThisWith(float param);

단일 결과 메서드

단일 결과를 반환하는 메서드는 동일한 자바 결과로 변환되어 단일 결과를 반환합니다. 예를 들면 다음과 같습니다.

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()에 전달할 수도 있습니다.

전송 오류 및 종료 수신자

서비스 구현은 다른 프로세스에서 실행될 수 있으므로, 경우에 따라 인터페이스를 구현하는 프로세스가 종료되더라도 클라이언트는 살아있을 수 있습니다. 종료된 프로세스에서 호스팅된 인터페이스 객체의 호출이 전송 오류(호출된 메서드에 의해 발생하는 런타임 예외)와 함께 실패합니다. I<InterfaceName>.getService() 호출을 통해 서비스의 새 인스턴스를 요청하여 이러한 실패로부터 복구할 수 있습니다. 이는 비정상 종료된 프로세스가 다시 시작되고 servicemanager로 다시 등록한 경우에만 작동합니다(HAL 구현에 일반적으로 true).

인터페이스의 클라이언트는 서비스가 종료할 때 종료 수신자를 등록하여 알림을 받을 수도 있습니다. 서버가 종료되는 것처럼 호출이 전송되는 경우에도 전송 오류가 발생할 수 있습니다. 검색된 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);