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

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

שיטות בטלות

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