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