Arayüz Yöntemleri ve Hatalar

Bu bölümde arayüz yöntemleri ve hataları ayrıntılarıyla anlatılmaktadır.

Geçersiz yöntemler

Sonuç döndürmeyen yöntemler, void döndüren Java yöntemlerine çevrilir. Örneğin, HIDL bildirimi:

doThisWith(float param);

… şuna dönüşür:

void doThisWith(float param);

Tek sonuç yöntemleri

Tek bir sonuç döndüren yöntemler, Java eşdeğerlerine çevrilir ve tek bir sonuç döndürür. Örneğin aşağıdakiler:

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

… şuna dönüşür:

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

Çoklu sonuç yöntemleri

Birden fazla sonuç döndüren her yöntem için, onValues ​​yöntemindeki tüm sonuçları sağlayan bir geri çağırma sınıfı oluşturulur. Bu geri çağırma, yönteme ek bir parametre görevi görür. Örneğin aşağıdakiler:

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

… şuna dönüşür:

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

oneProducesTwoThings() çağırıcısı, geri çağrıyı yerel olarak uygulamak için genellikle anonim bir iç sınıf veya lambda kullanır:

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 arama olarak 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 üçüncü parametre olarak MyCallback örneğini oneProducesTwoThings() öğesine iletin.

Taşıma hataları ve ölüm alıcıları

Hizmet uygulamaları farklı bir süreçte çalışabildiğinden, bazı durumlarda arayüzü uygulayan süreç öldüğünde bile istemci hayatta kalabilir. Ölü bir süreçte barındırılan bir arayüz nesnesine yapılan çağrılar, bir aktarım hatasıyla (çağrılan yöntem tarafından oluşturulan bir çalışma zamanı istisnası) başarısız olur. Böyle bir hatadan kurtulmak I<InterfaceName>.getService() çağrılarak hizmetin yeni bir örneğinin istenmesiyle mümkündür. Ancak bu yöntem yalnızca çöken işlem yeniden başlatıldığında ve hizmetlerini servicemanager'a yeniden kaydettirdiğinde çalışır (bu genellikle HAL uygulamaları için geçerlidir).

Bir arayüzün istemcileri, bir hizmet sona erdiğinde bildirim almak için bir ölüm alıcısını da kaydedebilir. Sunucu ölürken bir çağrı yapılırsa aktarım hataları yine de meydana gelebilir. Alınan bir IFoo arayüzünde bu tür bildirimlere kaydolmak için istemci aşağıdakileri yapabilir:

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

recipient parametresi, HIDL tarafından sağlanan HwBinder.DeathRecipient arabiriminin bir uygulaması olmalıdır. Arayüz, arayüzü barındıran işlem öldüğünde çağrılan tek bir serviceDied() yöntemini içerir.

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

cookie parametresi linkToDeath() çağrısıyla iletilen çerezi içerir. Aşağıdakileri kullanarak kaydettikten sonra vefat alıcısının kaydını silmek de mümkündür:

foo.unlinkToDeath(recipient);