इस सेक्शन में इंटरफ़ेस के तरीकों और गड़बड़ियों के बारे में जानकारी दी गई है.
शून्य करने के तरीके
नतीजे न दिखाने वाले तरीकों को 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. } }
… और oneProducesTwoThings()
के तीसरे पैरामीटर के तौर पर MyCallback
का एक इंस्टेंस पास करें.
ट्रांसपोर्ट से जुड़ी गड़बड़ियां और मृत व्यक्ति के नाम पर पैसे पाने वाले
सेवा को लागू करने की प्रोसेस, किसी दूसरी प्रोसेस में चल सकती है. इसलिए, कुछ मामलों में क्लाइंट तब भी चालू रह सकता है, जब इंटरफ़ेस को लागू करने वाली प्रोसेस बंद हो गई हो.
बंद प्रोसेस में होस्ट किए गए इंटरफ़ेस ऑब्जेक्ट पर कॉल करने पर, ट्रांसपोर्ट से जुड़ी गड़बड़ी (कॉल किए गए तरीके से ट्रांसफ़र के दौरान मिलने वाला अपवाद) दिखती है. इस तरह की गड़बड़ी को ठीक करने के लिए, I<InterfaceName>.getService()
को कॉल करके सेवा के नए इंस्टेंस का अनुरोध करें. हालांकि, यह तरीका सिर्फ़ तब काम करता है, जब क्रैश हुई प्रोसेस को फिर से शुरू किया गया हो और उसने अपनी सेवाओं को servicemanager के साथ फिर से रजिस्टर किया हो. आम तौर पर, यह तरीका HAL लागू करने के लिए सही होता है.
किसी इंटरफ़ेस के क्लाइंट, डेथ रिसीपेंट को भी रजिस्टर कर सकते हैं, ताकि किसी सेवा के बंद होने पर उन्हें सूचना मिल सके. अगर सर्वर बंद होने के ठीक बाद कॉल किया जाता है, तो ट्रांसपोर्ट से जुड़ी गड़बड़ियां अब भी हो सकती हैं. वापस लाए गए IFoo
इंटरफ़ेस पर ऐसी सूचनाओं के लिए रजिस्टर करने के लिए, क्लाइंट यह तरीका अपना सकता है:
foo.linkToDeath(recipient, 1481 /* cookie */);
recipient
पैरामीटर, HIDL के ज़रिए दिए गए इंटरफ़ेस HwBinder.DeathRecipient
का लागू होना चाहिए. इंटरफ़ेस में एक तरीका serviceDied()
होता है, जिसे इंटरफ़ेस को होस्ट करने वाली प्रोसेस के बंद होने पर कॉल किया जाता है.
final class DeathRecipient implements HwBinder.DeathRecipient { @Override public void serviceDied(long cookie) { // Deal with service going away } }
cookie
पैरामीटर में वह कुकी शामिल होती है जिसे linkToDeath()
को कॉल करने के साथ पास किया गया था. मृत व्यक्ति के ईमेल पाने वाले व्यक्ति को रजिस्टर करने के बाद, उसे अनरजिस्टर भी किया जा सकता है. इसके लिए, इनका इस्तेमाल करें:
foo.unlinkToDeath(recipient);