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