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 kılma yöntemleri

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

doThisWith(float param);

… şu hâle gelir:

void doThisWith(float param);

Tek sonuçlu yöntemler

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

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

… şu hâle gelir:

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

Birden fazla sonuç yöntemi

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

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

… şu hâle gelir:

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

oneProducesTwoThings() çağrıcısı, geri çağırmayı 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 çağırma işlevi 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 oneProducesTwoThings() parametresine üçüncü parametre olarak bir MyCallback örneği gönderin.

Aktarım hataları ve ölüm alıcısı

Hizmet uygulamaları farklı bir süreçte çalışabileceğinden, bazı durumlarda istemci, bir arayüzü uygulayan süreç sona erdiğinde bile çalışmaya devam edebilir. Devre dışı bir işlemde barındırılan bir arayüz nesnesine yapılan çağrılar, aktarım hatasıyla (çağrılan yöntem tarafından oluşturulan bir çalışma zamanı istisnası) başarısız olur. Bu tür bir hatadan I<InterfaceName>.getService()'ü arayarak hizmetin yeni bir örneğini isteyerek kurtarabilirsiniz. Ancak bu yöntem yalnızca kilitlenen işlemin yeniden başlatılıp hizmetlerini servicemanager'a yeniden kaydettiği durumlarda işe yarar (bu durum genellikle HAL uygulamaları için geçerlidir).

Bir arayüzün istemcileri, bir hizmet sonlandırıldığında bildirim almak için sonlandırma alıcıları da kaydedebilir. Sunucu tam kapanırken çağrı yapılırsa aktarım hataları yine de oluşabilir. 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 arayüzünün bir uygulaması olmalıdır. Arayüz, arayüzü barındıran işlem sona erdiğinde çağrılan tek bir serviceDied() yöntemi 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 bir miras alıcısının kaydını da iptal edebilirsiniz:

foo.unlinkToDeath(recipient);