2012-10-15 18 views
5

मैंने कस्टम ईवेंट और ईवेंट श्रोताओं को बनाने का तरीका जानने के लिए Google पर खोज की। इसके बारे में कुछ लेख पढ़ने के बाद, मैं अभी भी उलझन में हूं। मैं आपको की समीक्षा के लिए लोगों से कस्टम ईवेंट (गैर-जीयूआई संबंधित घटनाओं) और हैंडलर बनाने के तरीकों से पूछना चाहता हूं। क्या कुछ कस्टम घटनाओं और श्रोताओं को बनाने के तरीके पर एक सरल स्पष्टीकरण प्रदान कर सकते हैं?जावा इवेंट्स और इवेंट श्रोताओं

उत्तर

6

आप मूल रूप से श्रोता जैसे

public interface EatListener { 

    ... 

} 
EatListener वर्ग के अंदर

के रूप में एक अंतरफलक बनाते हैं, आप विधि है कि आप विधि के पैरामीटर के रूप में घटना के साथ फोन है, जैसे कि

public void onEat(EatEvent); 

तो आपके पास ऐसे मानव की तरह कक्षा हो सकती है जो ईटलिस्टर को लागू या तत्काल करता है; जैसे कि

public class Human { 

    private EatListener listener; 

    public void eatFood(Food food) { 
     if(listener != null) { 
      listener.onEat(new EatEvent(food)); 
     } 
    } 

} 

तो आपको वास्तविक ईटिवेंट होना चाहिए; जो संभवतः कुछ अतिरिक्त डेटा के साथ भोजन के लिए रैपर के रूप में सरल हो सकता है।

जावा आपको लगता है कि इंटरफ़ेस से गुमनाम भीतरी कक्षाएं बना सकता है पर किसी भी जीयूआई के साथ के रूप में:

new EatListener() { 
    public void onEat(EatEvent event) { 
     System.out.println("I just ate " + event.getFood().getName()); 
    } 
} 
1

मैं घटना आधारित सिस्टम (गैर जीयूआई) के बहुत सारे लिखा है और वहाँ अपने खुद को लागू करने में कई gotchas हैं । कुछ क्लासिक चीजें थ्रेडिंग और मेमोरी लीक हैं।

थ्रेडिंग/प्रोसेस कंट्रोल का मतलब यह है कि जब आप किसी ईवेंट को आग लगते हैं, श्रोता कब आते हैं - तुरंत या बाद में? यदि आप तुरंत आग लगते हैं, तो आप वास्तव में खराब प्रदर्शन करने वाली प्रणाली के साथ समाप्त हो सकते हैं जो लगातार एक घटना पर प्रतिक्रिया दे रहा है जो श्रोता के बाद तुरंत बदलता है। यहां कोई आसान जवाब नहीं है, और यह वास्तव में आपकी ज़रूरत पर निर्भर करता है। आम तौर पर, यदि आप किसी ईवेंट की फायरिंग को रोक सकते हैं तो आपके पास एक बेहतर प्रदर्शन प्रणाली होगी (क्योंकि यह एक ही घटना के लिए श्रोता को कई बार कॉल करने से बच सकता है - या घटनाओं का एक चक्र जो एक ही घटना की ओर जाता है)

दूसरा बड़ा गोचा मेमोरी लीक है। जावा में डिलीट की कमी एक सुंदर बात है, लेकिन श्रोताओं एक विशाल बंदूक है जो आपके पैर पर चिपक जाती है। यदि आपके पास एक श्रोता है जो किसी उदाहरण से जुड़ा हुआ है जो स्मृति के भार का उपयोग करता है, तब तक जब तक किसी अन्य ऑब्जेक्ट में उस श्रोता का संदर्भ होता है, तो वह स्मृति चारों ओर लटकती जा रही है। इसके लिए समाधान का एक गुच्छा है, जैसे वीक रेफरेंस, लेकिन सामान्य रूप से, आपको बहुत सावधान रहना होगा और श्रोताओं की संख्या की जांच करनी होगी जब आप अपने आवेदन का परीक्षण कर रहे हों और सुनिश्चित करें कि वे अलग-अलग (असूचीबद्ध? :)) को अलग-अलग करें।

संक्षेप में, अगर मैं तुम्हें थे, मैं की तरह कुछ प्रयोग करने पर विचार होगा: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/eventbus/package-summary.html http://codingjunkie.net/guava-eventbus/ जो मन में इन मुद्दों में से कई के साथ विकसित किया गया है।

संबंधित मुद्दे