2012-03-26 13 views
9

ho visto questa discussione: How to implement a listener sui listener dell'attrezzo.android come rendere l'ascoltatore una variabile personalizzata?

è in realtà piuttosto semplice, ma non capisco esattamente come è fatto e come implementarlo nel mio codice.

Ho questa variabile variabile statica: AppLoader.isInternetOn. Voglio costruire un listener che ascolterà questa variabile e aggiorna un TextView.

dovrei fare questo:?

costruire un'interfaccia:

public interface InternetStateListener { 
    public void onStateChange(); 
} 

corsa nella mia attività:

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

risposta

23

tua attività non fa nulla di speciale, solo registrarsi (in quanto l'interfaccia è implementata direttamente nella classe) con l'altra classe che fornisce l'ascoltatore.

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

L'altra classe ha a che fare più o meno tutto il lavoro. Oltre a questo deve gestire la registrazione degli ascoltatori che deve chiamare il metodo onStateChange una volta che qualcosa è successo.

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 penso che ora abbia realizzato l'architettura! grazie molto! –

+0

Grazie per questo. Spiegazione molto buona e chiara – Kristopher

+0

Quindi, per qualsiasi classe che eredita l'interfaccia, verrà notificata con 'onStateChange()' quando 'mListener.onStateChange (booleano)' viene chiamato direttamente dall'interfaccia? Quindi è come se l'interfaccia comunichi con le classi che ereditano i sub ogni volta che una variabile cambia nell'interfaccia principale dopo aver completato un'attività che cambia la variabile, giusto? Grazie :) –

0

La parte che ti manca è la classe che notifica in realtà l'ascoltatore. Quindi avresti bisogno di una classe (molto probabilmente un servizio) che esegua e ping lo stato della rete. Quindi, quando rileva una modifica, deve chiamare onStateChange() in qualsiasi ascoltatore registrato. Quindi chiamerai setTheListener su quel servizio, non sulla tua attività.

Ecco un link che descrive accuratamente questo modello di progettazione: http://en.wikipedia.org/wiki/Observer_pattern

Problemi correlati