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