طرق الواجهة & أخطاء

يعرض هذا القسم تفاصيل طرق الواجهة وأخطاءها.

أساليب باطلة

تتم ترجمة الأساليب التي لا تُرجع النتائج إلى أساليب Java التي تُرجع void . على سبيل المثال، إعلان HIDL:

doThisWith(float param);

... يصبح:

void doThisWith(float param);

طرق النتيجة الواحدة

يتم ترجمة الطرق التي تُرجع نتيجة واحدة إلى مرادفاتها في Java وتُرجع أيضًا نتيجة واحدة. على سبيل المثال، ما يلي:

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