בקטע הזה מפורטים שיטות ומצבי שגיאה בממשק.
שיטות ליצירת ערכים לא חוקיים
שיטות שלא מחזירות תוצאות מתורגמות לשיטות 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);
שיטות עם כמה תוצאות
לכל שיטה שמחזירה יותר מתוצאה אחת נוצרת כיתת קריאה חוזרת שמספקת את כל התוצאות ב-method onValues
שלה.
הקריאה החוזרת הזו משמשת כפרמטר נוסף ל-method. לדוגמה, האפשרויות הבאות:
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
כפרמטר השלישי ל-oneProducesTwoThings()
.
שגיאות בהעברה ונמענים שנפטרו
מאחר שהטמעות של שירותים יכולות לפעול בתהליך אחר, בחלק מהמקרים הלקוח יכול להישאר פעיל גם כשהתהליך שמטמיע את הממשק מסתיים.
קריאות לאובייקט ממשק שמתארח בתהליך מושבת נכשלות עם שגיאת תעבורה (הודעת חריגה בסביבת זמן ריצה שמופיעה על ידי השיטה שנקראת). כדי להתאושש מכשל כזה, אפשר לבקש מכונה חדשה של השירות באמצעות קריאה ל-I<InterfaceName>.getService()
. עם זאת, השיטה הזו פועלת רק אם התהליך שהתרסק הופעל מחדש והשירותים שלו רשומים מחדש ב-servicemanager (בדרך כלל זה נכון להטמעות של HAL).
לקוחות של ממשק יכולים גם לרשום נמען לקבלת הודעה על מוות כדי לקבל התראה כששירות מסוים יוצא משימוש. עדיין יכולות להתרחש שגיאות בהעברה אם הקריאה מתבצעת בדיוק בזמן שהשרת נכשל. כדי להירשם לקבלת התראות כאלה בממשק IFoo
שאוחזר, הלקוח יכול לבצע את הפעולות הבאות:
foo.linkToDeath(recipient, 1481 /* cookie */);
הפרמטר recipient
חייב להיות הטמעה של הממשק HwBinder.DeathRecipient
ש-HIDL מספק. הממשק מכיל method יחיד, serviceDied()
, שנקרא כשהתהליך שמארח את הממשק מסתיים.
final class DeathRecipient implements HwBinder.DeathRecipient { @Override public void serviceDied(long cookie) { // Deal with service going away } }
הפרמטר cookie
מכיל את קובץ ה-cookie שהוענק בקריאה ל-linkToDeath()
. אפשר גם לבטל את הרישום של נמען במקרה מוות אחרי הרישום שלו באמצעות:
foo.unlinkToDeath(recipient);