שיטות ושגיאות בממשק

בקטע הזה מפורטות השיטות והשגיאות בממשק.

שיטות מבוטלות

שיטות שלא מחזירות תוצאות מתורגמות לשיטות 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);

שיטות לקבלת תוצאות מרובות

לכל שיטה שמחזירה יותר מתוצאה אחת, מחלקת הקריאה החוזרת (callback) שמספקת את כל התוצאות בשיטה 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 כדי להטמיע את הקריאה החוזרת באופן מקומי:

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().

שגיאות בהעברה ונמענים של מקרי מוות

מכיוון שהטמעות שירותים יכולות לפעול בתהליך שונה, במקרים מסוימים הלקוח יכול להישאר בחיים גם כשתהליך ההטמעה של הממשק מת. קריאות לאובייקט בממשק שמתארח בתהליך ללא פעילות נכשלת עם תעבורה (שגיאת זמן ריצה שנרשמה על ידי ה-method שנקראה). התאוששות היא יכולה לבקש מופע חדש של השירות באמצעות קריאה 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 מכיל את קובץ ה-cookie שהועבר עם את הקריאה ל-linkToDeath(). אפשר גם לבטל את הרישום של פטירה נמען אחרי הרישום באמצעות:

foo.unlinkToDeath(recipient);