วิธีการและข้อผิดพลาดของอินเทอร์เฟซ

ส่วนนี้แสดงรายละเอียดวิธีการและข้อผิดพลาดของอินเทอร์เฟซ

วิธีการที่เป็นโมฆะ

เมธอดที่ไม่แสดงผลลัพธ์จะได้รับการแปลเป็นเมธอด 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);

วิธีการที่ใช้ผลลัพธ์หลายรายการ

สำหรับแต่ละเมธอดที่แสดงผลลัพธ์มากกว่า 1 รายการ คลาส Callback จะ สร้างผลลัพธ์ทั้งหมดในเมธอด onValues Callback นี้จะทำหน้าที่เป็นพารามิเตอร์เพิ่มเติมของเมธอด ตัวอย่างเช่น พารามิเตอร์ ดังต่อไปนี้:

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 แบบไม่ระบุชื่อเพื่อใช้ Callback ในเครื่อง

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

นอกจากนี้คุณยังกําหนดชั้นเรียนเพื่อใช้เป็น Callback ได้ด้วย ...

class MyCallback implements oneProducesTwoThingsCallback {
  public void onValues(double a, double b) {
    // do something interesting with a and b.
  }
}

... และส่งอินสแตนซ์ของ MyCallback เป็นพารามิเตอร์ที่ 3 ไปยัง 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);