2012-03-26 16 views
9

He visto este hilo: How to implement a listener sobre implementar oyentes.android cómo hacer oyente a una variable personalizada?

es realmente bastante simple, pero no entiendo cómo se hace exactamente y cómo implementarlo en mi propio código.

tengo esta variable variable estática: AppLoader.isInternetOn. Quiero construir un oyente que escuche los cambios de esta variable y actualice un TextView.

debo hacer esto:?

crear una interfaz:

public interface InternetStateListener { 
    public void onStateChange(); 
} 

ejecutarlo en mi actividad:

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

Respuesta

23

Su actividad no hace nada especial, sólo registrarse a sí mismo (ya que la interfaz se implementa directamente en la clase) con la otra clase que proporciona el oyente.

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

La otra clase tiene que hacer casi todo el trabajo. Además de que tiene que manejar el registro de oyentes, tiene que llamar al método onStateChange una vez que algo sucedió.

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 creo que iv'e ahora se dio cuenta de la arquitectura! ¡muchas gracias! –

+0

Gracias por esto. Muy buena y clara explicación. – Kristopher

+0

Entonces, para cualquier clase que herede la interfaz, se les notificará con 'onStateChange()' cuando 'mListener.onStateChange (boolean)' se invoque directamente desde la interfaz? Entonces, es como si la interfaz se estuviera comunicando con cualquier clase sub heredada cada vez que una variable cambia en la interfaz principal después de completar una tarea que cambia la variable, ¿verdad? Gracias :) –

0

La parte que se está perdiendo es la clase que realmente notifica al oyente. Por lo tanto, necesitaría una clase (probablemente un servicio) que ejecute y explote el estado de la red. Luego, cuando detecta un cambio, debe invocar aStateChange() en cualquier oyente registrado. Entonces llamarías a setTheListener en ese servicio, no en tu actividad.

Aquí hay un enlace que describe minuciosamente este patrón de diseño: http://en.wikipedia.org/wiki/Observer_pattern

Cuestiones relacionadas