इंटरफ़ेस के तरीके और गड़बड़ियां

इस सेक्शन में, इंटरफ़ेस के तरीकों और गड़बड़ियों की जानकारी दी गई है.

अमान्य तरीके

जिन तरीकों से नतीजे नहीं मिलते उन्हें 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() का कॉलर आम तौर पर अनाम इनर क्लास या lambda को स्थानीय तौर पर कॉलबैक लागू करें:

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 पैरामीटर 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);