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

يوضّح هذا القسم طرق الواجهة والأخطاء.

طرق الإبطال

يتم ترجمة الطرق التي لا تعرض نتائج إلى طرق 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() فئة داخلية مجهولة أو دالة لامبادا لتنفيذ دالة الاستدعاء محليًا:

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