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