2010-06-06 25 views
41

Ho bisogno di impostare un semplice listener di eventi per aggiornare uno ListView una volta ogni tanto. Il problema è che non so come posso generare un evento.Listener di eventi personalizzati sull'app per Android

So che per eventi come la pressione di un tasto o di un pulsante, devo solo implementare lo Handler. Ma in questo caso specifico ho effettivamente bisogno di generare l'evento, che verrà attivato ogni volta che un altro thread in esecuzione della mia app si riattiva e aggiorna la sua lista di notizie da un feed RSS.

Ho fatto tutto, ma sono rimasto bloccato qui. Posso avere qualche suggerimento o link con qualche informazione in più su come implementarlo?

risposta

88
  1. definire un'interfaccia di callback

     public interface NewsUpdateListener 
         { 
          void onNewsUpdate(<News data to be passed>); 
         } 
    
  2. Fornire un funzione di registrazione sul thread in background che ottiene la fe RSS 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. fuoco la richiamata quando la notizia è disponibile

    .... 
    for (listener : listeners) 
    { 
        listener.onNewsUpdate(<News data to be passed>); 
    } 
    .... 
    
  4. Registrati ascoltatore da qualche parte durante l'inizializzazione

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

Puoi approfondire dove mettere i diversi frammenti? – Sulby

+0

@ FireFly3000: I _think_ Snippet 2 è una classe java che si desidera avere un evento, lo snippet 1 può essere in un file separato o essere una sottoclasse di 2. Snippet 3 deve essere un membro dello snippet 2. Lo snippet 4 entra in la classe che vuole ascoltare l'evento. –

+0

Grazie per la soluzione Awesome. E qual è il momento giusto per annullare la registrazione di un ascoltatore? Dal momento che si aggiungono listener in arrayList ogni volta, quando si rimuoverà un listener? –

3

Sembra che tu abbia bisogno di un gestore - (cercare android.os.Handler per i dettagli).

Il metodo sendMessageDelayed consente di pianificare quando il messaggio viene inviato al gestore.

Una rapida ricerca tirato su un esempio completo che dovrebbe iniziare: http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html

+3

Questo non è il modo migliore per andare, ci sono molte situazioni in cui è necessaria una reazione rapida sul lato listener, e sendMessageDelayed/Handlers aggiungerà ritardi indesiderati. L'approccio migliore consiste nel creare un'interfaccia listner e tenere una serie di listener come nell'esempio di Sameer riportato di seguito. – radhoo

27

provare questo:

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

Questo approccio ha il vantaggio della semplicità, tuttavia la risposta di Sameer consente di impostare più di un ascoltatore per un dato evento, una soluzione che di solito raccomando. – radhoo

+0

Grazie, ha funzionato per me. Semplice ed elegante –

2

È possibile utilizzare android life cycle per questo.

Creare un'interfaccia di segnale, alias il vostro evento

interface NewsUpdateSignal{ 
    void newsUpdateHandler(Mydata data); 
} 

Than registrati per all'interno della vostra attività o in qualsiasi altro luogo che si desidera, ci potrebbero essere molti ascoltatori stesso Signal.

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

E inviare il segnale quando è necessario, da dove mai avete bisogno.

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

Disclaimer: io sono l'autore del ciclo di vita Android.

+0

Questo è piuttosto interessante –

+0

@DanielCardenas tnx, in realtà è più semplice ora (hai solo bisogno di creare un'interfaccia per il tuo evento), ho aggiornato la risposta per usare l'ultima versione di Life Cycle –

Problemi correlati