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

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

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

วิธีการที่ไม่ส่งคืนผลลัพธ์จะถูกแปลเป็นวิธีการ 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);