2010-06-06 26 views
41

Necesito configurar un escucha de evento simple para actualizar un ListView de vez en cuando. El problema es que no sé cómo podría generar un evento.Escucha de evento personalizado en la aplicación de Android

Sé que para eventos como presionar la tecla o el botón solo tengo que implementar el Handler. Pero en este caso específico, realmente necesito generar el evento, que se disparará cada vez que se despierte otro hilo en funcionamiento de mi aplicación y actualice su lista de noticias de un canal RSS.

He hecho todo, pero me quedé atrapado aquí. ¿Puedo obtener alguna sugerencia o enlace con más información sobre cómo implementar esto?

Respuesta

88
  1. definir una interfaz de devolución de llamada

     public interface NewsUpdateListener 
         { 
          void onNewsUpdate(<News data to be passed>); 
         } 
    
  2. Proporcionar una facilidad de registro en el hilo de fondo que obtiene el RSS fe ed

    class <Background processing class name> 
        { 
        .... 
         ArrayList<NewsUpdateListener> listeners = new ArrayList<NewsUpdateListener>(); 
        .... 
         public void setOnNewsUpdateListener (NewsUpdateListener listener) 
         { 
          // Store the listener object 
          this.listeners.add(listener); 
         } 
        .... 
        } 
    
  3. fuego la devolución de llamada cuando la noticia está disponible

    .... 
    for (listener : listeners) 
    { 
        listener.onNewsUpdate(<News data to be passed>); 
    } 
    .... 
    
  4. Registro oyente algún lugar durante la inicialización

    .... 
        <class <Background processing class object>.registerListener 
    (
        new OnNewsUpdateListener() { 
         onNewsUpdate(<News Data>) { 
          // process news data 
          runOnUIThread(new Runnable() { 
           public void run() { 
            // refresh list view 
           } 
          } 
         } 
    } 
    .... 
    
+0

¿Puede detallar dónde colocar los diferentes fragmentos? – Sulby

+0

@ FireFly3000: I _think_ Snippet 2 es una clase Java que desea tener un evento, el fragmento 1 puede estar en un archivo separado o ser una subclase de 2. El fragmento 3 debe ser un miembro del fragmento 2. El fragmento 4 entra la clase que quiere escuchar el evento. –

+0

Gracias por la increíble solución. ¿Y cuál es el momento apropiado para anular el registro de un oyente? Ya que está agregando oyentes en arrayList cada vez, ¿cuándo eliminará un oyente? –

3

Parece que necesita un controlador - (consulte android.os.Handler para obtener más información).

El método sendMessageDelayed le permitirá programar cuándo se enviará el mensaje a su controlador.

Una búsqueda rápida se detuvo un ejemplo completo que debería empezar: http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html

+3

Esta no es la mejor manera de hacerlo, hay muchas situaciones en las que necesita una pronta reacción por parte del oyente, y sendMessageDelayed/Handlers agregará demoras no deseadas. El mejor enfoque es crear una interfaz de lista y mantener una matriz de oyentes según el ejemplo de Sameer a continuación. – radhoo

27

intente esto:

interface MyHandlerInterface 
{ 
    void onHandle(Object obj) 
} 
class myListClass 
{ 
    MyHandlerInterface myHandler; 
    public void setHandlerListener(MyHandlerInterface listener) 
    { 
     myHandler=listener; 
    } 
    protected void myEventFired(myObj) 
    { 
     if(myHandler!=null) 
     myHandler.onHandle(myObj); 
    } 
} 
+3

Este enfoque tiene la ventaja de la simplicidad, sin embargo, la respuesta de Sameer permite que se configure más de un oyente para un evento determinado, una solución que normalmente recomiendo. – radhoo

+0

Gracias, funcionó para mí. Simple y elegante –

2

Puede utilizar android life cycle para eso.

Crear una interfaz de señal, también conocido como el evento

interface NewsUpdateSignal{ 
    void newsUpdateHandler(Mydata data); 
} 

, a registrar a él dentro de su actividad o en cualquier otro lugar que desee, podría haber muchos oyentes a Signal misma.

class MyActivity extends Activity implements NewsUpdateSignal{ 
    Signal<NewsUpateSignal> newsUpdateSignal = SignalsBag.inject(NewsUpateSignal.class); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     newsUpdateSignal.addListener(this);   
    } 

    @Override 
    public void newsUpdateHandler(final Mydata data){ 
      //Do something here 
    } 
} 

Y envíe la señal cuando lo necesite, desde donde necesite.

Class A{ 
    Signal<NewsUpateSignal> newsUpdateSignal = SignalsBag.inject(NewsUpateSignal.class); 

    void execute(){ 
     // obtain the data somehow, and dispatch it, the callback will be invoked on the same thread 
     newsUpdateSignal.dispatcher.newsUpdateHandler(data); 
    }   
} 

responsabilidad: yo soy el autor del ciclo de vida del androide.

+0

Este es bastante interesante –

+0

@DanielCardenas tnx, en realidad es más simple ahora (Solo necesitas crear una interfaz para tu evento), actualicé la respuesta para usar la última versión de Life Cycle –

Cuestiones relacionadas