این بخش جزئیات روشها و خطاهای میانای برنامهسازی کاربردی را ارائه میدهد.
روشهای باطل
روشهایی که نتیجهای برنمیگردانند به روشهای 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()، میتوان از چنین
شکستی بازیابی کرد. بااینحال، این روش فقط درصورتی کار میکند
که فرایند ازکارافتاده بازراهاندازی شده باشد و سرویسهایش را دوباره در
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);