סעיף זה מפרט שיטות ממשק ושגיאות.
שיטות בטלות
שיטות שאינן מחזירות תוצאות מתורגמות לשיטות 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
מכיל את ה-cookie שהועבר עם הקריאה ל- linkToDeath()
. אפשר גם לבטל רישום של מקבל מוות לאחר רישום זה באמצעות:
foo.unlinkToDeath(recipient);