این بخش روش ها و خطاهای رابط را توضیح می دهد.
روش های خالی
روشهایی که نتایج را بر نمیگردانند به روشهای جاوا ترجمه میشوند که void
را برمیگردانند. به عنوان مثال، اعلامیه HIDL:
doThisWith(float param);
… می شود:
void doThisWith(float param);
روش های تک نتیجه ای
روشهایی که یک نتیجه را برمیگردانند به معادلهای جاوای خود ترجمه میشوند و یک نتیجه را نیز برمیگردانند. به عنوان مثال موارد زیر:
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
خود ارائه می کند. این فراخوانی به عنوان یک پارامتر اضافی برای روش عمل می کند. به عنوان مثال موارد زیر:
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()
معمولاً از یک کلاس داخلی ناشناس یا لامبدا برای پیاده سازی 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)));
همچنین میتوانید کلاسی را برای استفاده به عنوان پاسخ به تماس تعریف کنید…
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 ارائه شده است. این رابط شامل یک متد serviceDied()
که زمانی فراخوانی میشود که فرآیند میزبان اینترفیس از بین میرود.
final class DeathRecipient implements HwBinder.DeathRecipient { @Override public void serviceDied(long cookie) { // Deal with service going away } }
پارامتر cookie
حاوی کوکی است که با فراخوانی linkToDeath()
ارسال شده است. همچنین امکان لغو ثبت نام گیرنده فوت پس از ثبت نام با استفاده از موارد زیر وجود دارد:
foo.unlinkToDeath(recipient);