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

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

วิธีการที่ยกเลิก

ระบบจะแปลเมธอดที่ไม่แสดงผลลัพธ์เป็นเมธอด 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 รายการ ระบบจะสร้างคลาสการเรียกคืนซึ่งให้ผลลัพธ์ทั้งหมดในเมธอด 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 เป็นพารามิเตอร์ที่ 3 ให้กับ oneProducesTwoThings()

ข้อผิดพลาดในการขนส่งและผู้รับพัสดุที่เสียชีวิต

เนื่องจากการติดตั้งใช้งานบริการสามารถทํางานในกระบวนการอื่นได้ ในบางกรณีไคลเอ็นต์อาจยังคงทำงานอยู่แม้ว่ากระบวนการติดตั้งใช้งานอินเทอร์เฟซจะหยุดทำงานไปแล้วก็ตาม การเรียกใช้ออบเจ็กต์อินเทอร์เฟซที่โฮสต์ในกระบวนการที่หยุดทำงานไม่สำเร็จเนื่องจากข้อผิดพลาดในการขนส่ง (ข้อยกเว้นรันไทม์ที่เมธอดที่เรียกใช้แสดง) การกู้คืนจากข้อผิดพลาดดังกล่าวทำได้โดยการขออินสแตนซ์ใหม่ของบริการโดยเรียกใช้ I<InterfaceName>.getService() อย่างไรก็ตาม วิธีนี้จะได้ผลก็ต่อเมื่อกระบวนการที่ขัดข้องได้เริ่มต้นใหม่และลงทะเบียนบริการกับ ServiceManager อีกครั้ง (ซึ่งโดยทั่วไปเป็นจริงสำหรับการใช้งาน 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);