Arayüz yöntemleri ve hataları

Bu bölümde, arayüz yöntemleri ve hatalar ayrıntılı olarak açıklanmaktadır.

Geçersiz yöntemler

Sonuç döndürmeyen yöntemler, fonksiyonel olarak izin verilen Java yöntemlerine iade void. Örneğin, HIDL beyanı:

doThisWith(float param);

... şu hale gelir:

void doThisWith(float param);

Tek sonuç yöntemleri

Tek sonuç döndüren yöntemler Java'larına çevrilir aynı zamanda tek bir sonuç döndürüyor. Örneğin, aşağıdakiler:

doQuiteABit(int32_t a, int64_t b,
            float c, double d) generates (double something);

... şu hale gelir:

double doQuiteABit(int a, long b, float c, double d);

Birden çok sonuç yöntemleri

Birden fazla sonuç döndüren her yöntem için bir geri çağırma sınıfı oluşturduğundan emin olun.onValues Bu geri çağırma, yönteme ek bir parametre görevi görür. Örneğin, takip etmek için:

oneProducesTwoThings(SomeEnum x) generates (double a, double b);

... şu hale gelir:

public interface oneProducesTwoThingsCallback {
    public void onValues(double a, double b);
}
void oneProducesTwoThings(byte x, oneProducesTwoThingsCallback cb);

oneProducesTwoThings() arayan bir kişi genellikle geri çağırmayı yerel olarak uygulamak için anonim iç sınıf veya lambda kullanın:

someInstanceOfFoo.oneProducesTwoThings(
         5 /* x */,
         new IFoo.oneProducesTwoThingsCallback() {
          @Override
          void onValues(double a, double b) {
             // do something interesting with a and b.
             ...
          }});

veya:

someInstanceOfFoo.oneProducesTwoThings(5 /* x */,
    (a, b) -> a > 3.0 ? f(a, b) : g(a, b)));

Ayrıca, geri çağırma amacıyla kullanılacak bir sınıf da tanımlayabilirsiniz...

class MyCallback implements oneProducesTwoThingsCallback {
  public void onValues(double a, double b) {
    // do something interesting with a and b.
  }
}

... ve bir MyCallback örneğini üçüncü parametre olarak oneProducesTwoThings().

Ulaşım hataları ve ölüm alıcıları

Hizmet uygulamaları farklı bir süreçte çalışabileceğinden, bazı durumlarda arayüzü uygulama işlemi kapansa bile müşteri hayatta kalabilir. Ölü bir işlemde barındırılan bir arayüz nesnesine yapılan çağrılar, aktarımla başarısız oluyor hatası (çağrılanan yöntem tarafından atılan bir çalışma zamanı istisnası). Böyle bir durumdan kurtarma hatası meydana gelebilir. Bunun için I<InterfaceName>.getService() Ancak bu yöntem işe yarıyor yalnızca kilitlenen işlem yeniden başlatılıp hizmetleri yeniden kaydettirilmişse (HAL uygulamaları için de bu genellikle geçerlidir).

Bir arayüzün istemcileri ise bir ölüm alıcısını kaydederek bir hizmet sona erdiğinde bildirim alın. Bir çağrı, sunucu öldüğünde yapılır. Alınan bir cihazda bu tür bildirimlere kaydolmak için: IFoo arayüzünde, istemci aşağıdaki işlemleri gerçekleştirebilir:

foo.linkToDeath(recipient, 1481 /* cookie */);

recipient parametresi, HwBinder.DeathRecipient arayüzü, HIDL tarafından sağlanmıştır. Arayüz şunu içeren tek bir yöntem içerir: serviceDied() arayüzün barındırıldığı işlem kapanacaktır.

final class DeathRecipient implements HwBinder.DeathRecipient {
    @Override
    public void serviceDied(long cookie) {
        // Deal with service going away
    }
}

cookie parametresi, linkToDeath() çağrısı. Ölümlerin kaydını iptal etmek de mümkündür şunu kullanarak kaydettirdikten sonra alıcı:

foo.unlinkToDeath(recipient);