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