2012-03-26 6 views
9

मैंने यह धागा देखा है: श्रोताओं को लागू करने के बारे में How to implement a listenerएंड्रॉइड श्रोता को कस्टम चर में कैसे बनाना है?

यह वास्तव में बहुत ही सरल है, लेकिन मुझे यह नहीं पता कि यह वास्तव में कैसे किया गया और मेरे अपने कोड में कैसे कार्यान्वित किया जाए।

मेरे पास यह स्थैतिक चर वैरिएबल है: AppLoader.isInternetOn। मैं एक श्रोता बनाना चाहता हूं जो इस परिवर्तनीय परिवर्तनों को सुन सके और टेक्स्टव्यू अपडेट करेगा।

क्या मुझे यह करना चाहिए:?

निर्माण एक अंतरफलक:

public interface InternetStateListener { 
    public void onStateChange(); 
} 

रन यह मेरी गतिविधि में:

public class MyActivity extends Activity { 
private InternetStateListener mListener; 

setTheListener(this); 

public void setTheListener(InternetStateListener listen) { 
    mListener = listen; 
} 

private void onStateChange() { 
    if (mListener != null) { 
     if (AppLoader.isInternetOn) 
     text.setText("on") 
     else 
     text.setText("off") 
    } 
    } 
} 

उत्तर

23

आपकी गतिविधि कुछ खास नहीं है, बस अपने आप पंजीकृत अन्य वर्ग है कि श्रोता प्रदान करता है के साथ (इंटरफ़ेस वर्ग में सीधे लागू किया गया है के बाद से)।

public class MyActivity extends Activity implements InternetManager.Listener { 

    private TextView mText; 
    private InternetManager mInetMgr; 

    /* called just like onCreate at some point in time */ 
    public void onStateChange(boolean state) { 
     if (state) { 
      mText.setText("on"); 
     } else { 
      mText.setText("off"); 
     } 
    } 

    public void onCreate() { 
     mInetMgr = new InternetManager(); 
     mInetMgr.registerListener(this); 
     mInetMgr.doYourWork(); 
    } 
} 

अन्य वर्ग काफी सब काम करने के लिए है। इसके अलावा श्रोताओं के पंजीकरण को संभालना है, इसे खुश करने के बाद onStateChange विधि को कॉल करना होगा।

public class InternetManager { 
    // all the listener stuff below 
    public interface Listener { 
     public void onStateChange(boolean state); 
    } 

    private Listener mListener = null; 
    public void registerListener (Listener listener) { 
     mListener = listener; 
    } 

    // ----------------------------- 
    // the part that this class does 

    private boolean isInternetOn = false; 
    public void doYourWork() { 
     // do things here 
     // at some point 
     isInternetOn = true; 
     // now notify if someone is interested. 
     if (mListener != null) 
      mListener.onStateChange(isInternetOn); 
    } 
} 
+0

ओह, मुझे लगता है कि अब मुझे वास्तुकला का एहसास हुआ है! बहुत धन्यवाद! –

+0

इसके लिए धन्यवाद। बहुत अच्छा और स्पष्ट स्पष्टीकरण। – Kristopher

+0

तो इंटरफ़ेस को विरासत में प्राप्त करने वाले किसी भी वर्ग के लिए, उन्हें 'onStateChange() 'के साथ अधिसूचित किया जाएगा जब' mListener.onStateChange (बूलियन)' को इंटरफ़ेस से सीधे कहा जाता है? तो इंटरफ़ेस की तरह किसी भी उप विरासत वर्गों के साथ संचार कर रहा है जब भी वेरिएबल को बदलने वाले कार्य को पूरा करने के बाद मुख्य इंटरफ़ेस में एक चर बदलता है, है ना? धन्यवाद :) –

0

बात यह है कि आप इसे वर्ग है कि वास्तव में श्रोता सूचित करता वंचित रह जाएंगे। तो आपको एक कक्षा (सबसे अधिक संभावना एक सेवा) की आवश्यकता होगी जो नेटवर्क की स्थिति को चलाता है और पिंग करता है। फिर जब यह किसी परिवर्तन को पहचानता है तो उसे किसी भी पंजीकृत श्रोताओं मेंStateChange() पर कॉल करना चाहिए। फिर आप उस सेवा पर सेट द लिस्टनर को कॉल करेंगे, न कि आपकी गतिविधि पर।

यह लिंक है जिसे अच्छी तरह से इस डिजाइन पैटर्न का वर्णन करता है: http://en.wikipedia.org/wiki/Observer_pattern