يوضح هذا القسم تفاصيل طرق الواجهة والأخطاء.
طرق إلغاء الاشتراك
تتم ترجمة الطرق التي لا تعرض نتائج إلى طرق Java التي
إرجاع void
. على سبيل المثال، بيان HIDL:
doThisWith(float param);
... يصبح:
void doThisWith(float param);
طرق النتيجة الفردية
تتم ترجمة الطرق التي تعرض نتيجة واحدة إلى لغة جافا الخاصة بها النتائج المكافئة التي تعرض نتيجة واحدة أيضًا. على سبيل المثال، ما يلي:
doQuiteABit(int32_t a, int64_t b, float c, double d) generates (double something);
... يصبح:
double doQuiteABit(int a, long b, float c, double d);
طرق النتائج المتعددة
بالنسبة لكل طريقة تقوم بإرجاع أكثر من نتيجة، فإن فئة معاودة الاتصال
الذي يوفر جميع النتائج بطريقة onValues
الخاصة به.
تعمل دالة الاستدعاء هذه كمعلمة إضافية في الطريقة. على سبيل المثال،
التالي:
oneProducesTwoThings(SomeEnum x) generates (double a, double b);
... يصبح:
public interface oneProducesTwoThingsCallback { public void onValues(double a, double b); } void oneProducesTwoThings(byte x, oneProducesTwoThingsCallback cb);
سيستخدم المتصل رقم oneProducesTwoThings()
عادةً
الفئة الداخلية المجهولة أو lambda لتنفيذ معاودة الاتصال محليًا:
someInstanceOfFoo.oneProducesTwoThings( 5 /* x */, new IFoo.oneProducesTwoThingsCallback() { @Override void onValues(double a, double b) { // do something interesting with a and b. ... }});
أو:
someInstanceOfFoo.oneProducesTwoThings(5 /* x */, (a, b) -> a > 3.0 ? f(a, b) : g(a, b)));
يمكنك أيضًا تحديد فئة لاستخدامها كاستدعاء ...
class MyCallback implements oneProducesTwoThingsCallback { public void onValues(double a, double b) { // do something interesting with a and b. } }
... وتمرير مثيل MyCallback
كمعلمة ثالثة إلى
oneProducesTwoThings()
أخطاء النقل ومستلمي الوفاة
بما أنّ عمليات تنفيذ الخدمات يمكن أن تعمل في عملية مختلفة، سيكون في بعض الحالات
يمكن للعميل البقاء على قيد الحياة حتى عندما تنتهي عملية تنفيذ الواجهة.
تعذّر تنفيذ الطلبات على عنصر واجهة مُستضاف في عملية معطّلة مع عملية نقل
خطأ (استثناء بيئة تشغيل تم طرحه باستخدام الطريقة المُستدعاة). كما أن عملية الاسترداد من
يمكن أن يحدث الفشل من خلال طلب مثيل جديد للخدمة من خلال
I<InterfaceName>.getService()
ومع ذلك، يمكن استخدام هذه الطريقة
فقط إذا تمت إعادة تشغيل العملية التي تعطّلت وإعادة تسجيل خدماتها
مع مدير الخدمة (وهذا صحيح بشكل عام لعمليات تنفيذ HAL).
يمكن لعملاء الواجهة أيضًا تسجيل مستلم وفاة للحصول على
أو إشعار عند توقف خدمة ما. وسيظل من الممكن حدوث أخطاء في النقل إذا كانت المكالمة
بمجرد توقف الخادم. للتسجيل في هذه الإشعارات على ملف
IFoo
، يمكن للعميل تنفيذ ما يلي:
foo.linkToDeath(recipient, 1481 /* cookie */);
يجب أن تكون المَعلمة recipient
تنفيذًا لـ
الواجهة HwBinder.DeathRecipient
التي توفّرها HIDL. الواجهة
يحتوي على طريقة واحدة serviceDied()
يتم استدعاؤها عند
إيقاف عملية استضافة الواجهة
final class DeathRecipient implements HwBinder.DeathRecipient { @Override public void serviceDied(long cookie) { // Deal with service going away } }
تحتوي المعلمة cookie
على ملف تعريف الارتباط الذي تم تمريره مع
المكالمة إلى linkToDeath()
. من الممكن أيضًا إلغاء تسجيل حالة وفاة
المستلم بعد تسجيله باستخدام:
foo.unlinkToDeath(recipient);