2011-05-02 16 views
7

श्रोता जोड़ने और श्रोता को सेट करने के बीच क्या अंतर है।श्रोता बनाम सेट श्रोता

उदा।

addTextChangedListener(textWatcher); 
setOnClickListener(clickListener); 

उत्तर:

aioobe के जवाब के बाद मैं अपने प्रोजेक्ट में इस परीक्षण किया है। तो हम यह कर सकते हैं।

editText.addTextChangedListener(textWatcher1); 
editText.addTextChangedListener(textWatcher2); 

लेकिन हम ऐसा नहीं कर सकते। एक और संदेह

(यह इस मामले में केवल पिछले श्रोता सेट हो जाएगा clickListener2)

button.setOnClickListener(clickListener1); 
button.setOnClickListener(clickListener2); 

मैं किसी भी सोचने के लिए सक्षम नहीं हूँ उस केस का उपयोग करें जिसमें मुझे एकल संपादन टेक्स्ट के लिए दो टेक्स्ट वाटर की आवश्यकता है। क्या कोई ऐसा उपयोग केस दे सकता है। (क्या मुझे इस प्रश्न को अलग प्रश्न के रूप में पूछना चाहिए?)

उत्तर

17

यदि आपके पास set -method आमतौर पर केवल एक श्रोता है। (व्यक्तिगत रूप से मैं उन्हें "हैंडलर" कहना पसंद करता हूं)।

add-तरीकों के साथ आप आमतौर पर श्रोताओं की मनमानी संख्या प्राप्त कर सकते हैं।

+3

+1 आप एक तेज़ लड़के हैं ... – MByD

+0

@aioobe तो आपका मतलब है कि मैं केवल एक क्लिक लिस्टनर सेट कर सकता हूं लेकिन मैं अपने उदाहरण में एक से अधिक टेक्स्टवॉचर को एक ही दृश्य में जोड़ सकता हूं। – Vivart

+0

हां। विधि नाम दिए गए मेरी व्याख्या होगी। सुनिश्चित करने के लिए आपको एपीआई दस्तावेज पर पढ़ना चाहिए। – aioobe

1

एओओब बिल्कुल सही है। लेकिन वहाँ एक अतिरिक्त विचार है:

JavaBeans मानक

  • getX/isXyz और setXyz परिभाषित गुण (देखें PropertyDescriptor), लेकिन
  • addXyzListener, removeXyzListener और getXyzListeners भी मानक नामकरण कर रहे हैं के अनुसार इवेंट श्रोताओं के लिए सम्मेलन (देखें EventSetDescriptor)

तो setXyzListener() जावाबीन मानक के अनुसार श्रोता सेट करने के लिए वैध विधि नाम नहीं है! बेशक आप जानबूझकर जावाबीन मानक का उल्लंघन करना चुन सकते हैं, लेकिन मैं आपको अनजाने में ऐसा करने की कोशिश कर रहा हूं :-)

0

मेरी राय में addXxxListener के बजाय setXxxListener विधियों के लिए कोई अच्छा कारण नहीं है। मुझे यकीन है कि प्रोग्रामर आलस्य के कारण बस "सेट" विधियां मौजूद हैं। यह वास्तव में दुखद है क्योंकि एक श्रोता सूची का समर्थन करना एक श्रोता का समर्थन करने से कहीं अधिक कठिन नहीं है। यह सच हो सकता है कि आप आम तौर पर केवल एक इच्छुक श्रोता की अपेक्षा करते हैं, लेकिन वैसे भी उनकी सूची का समर्थन करने के कई अच्छे कारण हैं।

श्रोता सूचियों की आवश्यकता का मेरा पसंदीदा उदाहरण डीबगिंग का समर्थन करना है। आप कुछ गतिविधि की निगरानी के लिए डायग्नोस्टिक श्रोता जोड़ना चाहते हैं, लेकिन केवल setXxxListener विधियों के साथ, डिबगिंग का कार्य आपके कोड को तोड़ सकता है! निचली पंक्ति यह है कि एक अवलोकन योग्य वर्ग लिखते समय आप अनावश्यक मान्यताओं को नहीं बनाना चाहते हैं कि इसका उपयोग कैसे किया जा रहा है।

यहाँ कुछ नमूदार वर्ग कहा जाता MyModel के लिए बॉयलरप्लेट है: के रूप में की जरूरत

public interface MyModelChangeListener { public void changed(MyModel model); } 
private ArrayList<MyModeChangeListener> listeners = new ArrayList<MyModeChangeListener>(); 
public void addMyModeChangeListener(MyModeChangeListener tcl) { listeners.add(tcl); } 
public void removeMyModeChangeListener(MyModeChangeListener tcl) { listeners.remove(tcl); } 
protected void fireMyModeChange() { for(MyModeChangeListener mmcl : listeners) mmcl.changed(this); } 

इच्छुक पार्टियां श्रोताओं जोड़ने के लिए, और MyModel कार्यान्वयन और किसी भी उप-वर्गों बस

fireMyModeChange(this) whenever their observable states change. 

मैं issue 5711 बनाया फोन इस समस्या के बारे में एंड्रॉइड प्रोजेक्ट इश्यू ट्रैकर में। अगर आप सहमत हैं कि यह एंड्रॉइड एसडीके में तय किया जाना चाहिए तो कृपया इसे तारांकित करें और शायद अपनी टिप्पणियां जोड़ें।

0

ऐडलिस्टर जावा बीन्स मानक है और सेट लिस्टर एंड्रॉइड मानक है, दोनों अलग-अलग संदर्भ में उपयोग कर रहे हैं। ऐडलिस्टर केवल डेस्कटॉप और वेब प्रोग्रामिंग के मामले में उपयोग किया जाता है क्योंकि यहां हमें कई घटकों से पूरी तरह से निपटना होगा। एंड्रॉइड में, सेट लिस्टनर का उपयोग किया जाता है क्योंकि यहां हमारे पास एक गतिविधि है। कुछ बिंदु पर, हम addLextiner जैसे addTextWatcher का उपयोग कर रहे हैं क्योंकि यह एक गतिविधि में हमें कई संपादन टेक्स्ट से निपटना होगा।

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