2012-09-21 13 views
5

किसी के लिए जावा पारिस्थितिक तंत्र के लिए अपेक्षाकृत नया, क्यूटी और डीजेगो जैसे सिग्नलिंग/रिसीवर सिस्टम के साथ क्या ढांचे को करने के लिए काफी हल्का तरीका है, जहां घटक कह सकते हैं "मैं कर रहा हूं कुछ ", और अन्य घटक इसे काफी ढीले ढंग से संभाल सकते हैं?जावा - सिग्नल/स्लॉट तंत्र

यदि यह प्रश्न "एकल उद्देश्य उत्तर" परीक्षण में विफल रहता है तो मैं पहले से माफ़ी मांगता हूं।

संपादित करें: थोड़ा और संदर्भ जोड़ने के लिए, यह एक वेब सेवा के लिए डेटाबेस संचालित अनुप्रयोग परत से संबंधित है। कुछ संसाधन, जब बने रहे, तो अतिरिक्त संदर्भ जानकारी वाले ऑडिट रिकॉर्ड को भी सहेजने की आवश्यकता होती है। Django में मैं सिग्नलिंग तंत्र के माध्यम से ऐसा करता हूं, या कई मौजूदा पुस्तकालयों में से एक का उपयोग करता हूं जो ऐसा करता है। एक स्कैला कार्यक्रम के लिए मैंने कॉलबैक फ़ंक्शंस का उपयोग करके अपनी खुद की हैकी चीज बनाई है, लेकिन प्रथम श्रेणी के कार्यों के साथ यह आसान है। मुझे इसमें कोई संदेह नहीं है कि स्विंग जैसे ढांचे इस तरह की चीज के लिए सुविधाएं प्रदान करते हैं, लेकिन मैं वर्तमान में एक काफी वेनिला एप्लिकेशन (इस पर निर्भर नहीं हूं कि डीजेगो खुद ही एक नहीं है) पर निर्भरता जोड़ने की इच्छा है (शायद अन्यायपूर्ण रूप से) वेनिला पायथन पर भारी निर्भरता!)

+0

आप [घटना चालित मॉडल] के बारे में बात कर रहे हैं के लेखक हूँ (http://en.wikibooks.org/wiki/Java_Programming/Event_Handling)? – jefflunt

+3

एक माध्यम से विशाल घटक स्तर पर जहां आपके पास 2 या अधिक विधि को लागू करने वाले इंटरफेस हैं, मुझे लगता है कि निर्भरता इंजेक्शन ने जोड़े को घटकों के बारे में लड़ाई जीती है। छोटे स्तर पर (जैसे एक जीयूआई बटन पर कार्रवाई प्रदान करना) श्रोता पैटर्न राजा है। –

+0

@ असामान्यता: हाँ, लेकिन सीधे जीयूआई प्रोग्रामिंग से संबंधित नहीं है। – Mikesname

उत्तर

3

जावा में, कम से कम यूआई पक्ष पर, यह आमतौर पर listener approach के साथ किया जाता है: आप एक श्रोता विधि पंजीकृत करते हैं जिसे विशिष्ट घटनाएं होती हैं। यह क्यूटी सिग्नल/स्लॉट तंत्र की तुलना में थोड़ी कम कम हो सकती है ... हालांकि एक अन्य दृष्टिकोण जिसे आप विचार कर सकते हैं वह जावा message service है, जिसे विशेष रूप से जावा ईई मानक के आधार पर क्लाइंट/सर्वर सिस्टम में कमजोर युग्मित संचार के लिए डिज़ाइन किया गया है।

+1

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

2

मैं घटना-संचालित प्रोग्रामिंग के बारे में अन्य टिप्पणियों/उत्तरों से सहमत हूं।

आपको http://eventbus.org में रुचि हो सकती है। यह आपको प्रत्येक घटना निर्माता पर श्रोताओं को स्पष्ट रूप से पंजीकृत किए बिना वैश्विक स्तर पर ईवेंट प्रसारित/प्राप्त करने की अनुमति देता है।

0

वर्ग जहां संकेत प्राप्त करना चाहते हैं, आप एक Broadcastreceiver परिभाषित कर सकते हैं: वर्ग जहां संकेत भेजने के लिए चाहते हैं, उसमें तो

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     updateUI(); 
    } 
}; 

@Override 
public void onPause() { 
    super.onPause(); 
    getActivity().unregisterReceiver(broadcastReceiver); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    getActivity().registerReceiver(broadcastReceiver, new IntentFilter(Constants.ACTION_UPDATE_PROFILE_UI)); // the constant is to identify the type of signal, it can be any string you want 
} 

, बस कार्य करें:

Intent signalIntent = new Intent(Constants.ACTION_UPDATE_PROFILE_UI); 

उस डेटा के प्रकार को जोड़ें जो आप चाहते हैं और फिर इसे प्रसारित करें:

sendBroadcast(signalIntent); 

आप ca n यहाँ एक उदाहरण आवेदन लगता है:

https://github.com/nickfox/Update-Android-UI-from-a-Service

3

आप देख रहे हैं एक जावा पुस्तकालय जो क्यूटी के लिए इसी तरह एक संकेत/स्लॉट तंत्र प्रदान करता है तो आप sig4j पर एक नजर है चाहिए के लिए। यह थ्रेडसेफ, टाइपएफ़ है और विभिन्न प्रकार के कनेक्शन का समर्थन करता है।

नोट: मैं इस पुस्तकालय :)

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