2012-03-26 6 views
9

Ich habe diesen Thread gesehen: How to implement a listener über implementieren Listener.android Wie man Listener zu einer benutzerdefinierten Variable machen?

es ist eigentlich ziemlich einfach, aber ich verstehe nicht, wie genau es getan und wie in meinem eigenen Code zu implementieren.

Ich habe diese statische Variable: AppLoader.isInternetOn. Ich möchte einen Listener erstellen, der auf diese Variablenänderungen hört und ein TextView aktualisiert.

sollte ich das tun:?

bauen eine Schnittstelle:

public interface InternetStateListener { 
    public void onStateChange(); 
} 

laufen sie in meiner Tätigkeit:

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") 
    } 
    } 
} 

Antwort

23

Ihre Aktivität tut nichts besonderes, sich nur registrieren, mit der anderen Klasse (da die Schnittstelle direkt in der Klasse implementiert wird), die den Hörer zur Verfügung stellt.

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(); 
    } 
} 

Die andere Klasse hat so ziemlich die ganze Arbeit zu tun. Außerdem muss es mit der Registrierung von Zuhörern umgehen, es muss die onStateChange Methode aufrufen, sobald etwas passiert ist.

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

ohhhh ich denke, dass jetzt die Architektur realisierte! Danke vielmals! –

+0

Vielen Dank dafür. Sehr gute und klare Erklärung. – Kristopher

+0

Also für alle Klassen, die die Schnittstelle erben, werden sie mit 'onStateChange()' benachrichtigt, wenn 'mlistener.onStateChange (boolean)' direkt von der Schnittstelle aufgerufen wird? Es ist also so, dass die Schnittstelle mit jeder untergeordneten vererbenden Klasse kommuniziert, wenn sich eine Variable in der Hauptschnittstelle nach dem Abschluss einer Aufgabe ändert, die die Variable ändert, richtig? Danke :) –

0

Der Teil, der Sie es die Klasse sind vermisst, die tatsächlich den Hörer benachrichtigt. Sie benötigen also eine Klasse (höchstwahrscheinlich einen Dienst), die den Status des Netzwerks ausführt und pingt. Wenn es eine Änderung erkennt, sollte es onStateChange() in allen registrierten Listenern aufrufen. Dann würden Sie setTheListener für diesen Dienst aufrufen, nicht für Ihre Aktivität.

Hier ist ein Link, der dieses Entwurfsmuster gründlich beschreibt: http://en.wikipedia.org/wiki/Observer_pattern

Verwandte Themen