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);