इंटरफ़ेस तरीके और amp; त्रुटियाँ

यह अनुभाग इंटरफ़ेस विधियों और त्रुटियों का विवरण देता है।

शून्य विधियाँ

जो विधियाँ परिणाम नहीं लौटातीं उन्हें जावा विधियों में अनुवादित किया जाता है जो 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);

एकाधिक-परिणाम विधियाँ

प्रत्येक विधि के लिए जो एक से अधिक परिणाम लौटाती है, एक कॉलबैक क्लास उत्पन्न होती है जो सभी परिणामों को अपनी 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() पर कॉल करके सेवा के नए उदाहरण का अनुरोध करके ऐसी विफलता से पुनर्प्राप्ति संभव है। हालाँकि, यह विधि केवल तभी काम करती है जब क्रैश हुई प्रक्रिया फिर से शुरू हो गई है और सर्विसमैनेजर के साथ अपनी सेवाओं को फिर से पंजीकृत कर लिया है (जो आम तौर पर एचएएल कार्यान्वयन के लिए सच है)।

इंटरफ़ेस के ग्राहक किसी सेवा के समाप्त होने पर सूचना प्राप्त करने के लिए मृत्यु प्राप्तकर्ता को भी पंजीकृत कर सकते हैं। यदि सर्वर बंद होने पर कॉल की जाती है तो परिवहन त्रुटियां अभी भी हो सकती हैं। पुनर्प्राप्त 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);