2010-06-06 7 views
41

Ich muss einen einfachen Ereignis-Listener einrichten, um eine ListView hin und wieder zu aktualisieren. Das Problem ist, ich weiß nicht, wie ich ein Ereignis generieren könnte.Benutzerdefinierter Ereignis-Listener in Android-App

Ich weiß, dass für Ereignisse wie Taste oder Taste nur ich die Handler implementieren muss. Aber in diesem speziellen Fall muss ich tatsächlich das Ereignis generieren, das jedes Mal ausgelöst wird, wenn ein anderer laufender Thread meiner App aufwacht und seine Liste von Nachrichten aus einem RSS-Feed aktualisiert.

Ich habe alles gemacht, bin aber hier steckengeblieben. Kann ich einen Vorschlag oder einen Link mit weiteren Informationen zur Implementierung erhalten?

Antwort

88
  1. eine Schnittstelle Rückruf definieren

     public interface NewsUpdateListener 
         { 
          void onNewsUpdate(<News data to be passed>); 
         } 
    
  2. ein Geben Registrierungsmöglichkeit auf dem Hintergrundthread, der den RSS fe bekommt 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. Feuer der Rückruf, wenn Nachricht ist, während der Initialisierung

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

Können Sie näher erläutern, wo Sie die verschiedenen Snippets platzieren können? – Sulby

+0

@ FireFly3000: I _think_ Snippet 2 ist eine Java-Klasse, die Sie ein Ereignis haben möchten, Snippet 1 kann in einer separaten Datei sein oder eine Unterklasse von 2. Snippet 3 sollte ein Mitglied von Snippet 2 sein. Snippet 4 geht in die Klasse, die auf das Ereignis hören möchte. –

+0

Danke für die tolle Lösung. Und wann ist es angemessen, die Registrierung eines Zuhörers aufzuheben? Da Sie jedes Mal Listener in ArrayList hinzufügen, wann werden Sie einen Listener entfernen? –

3

Es klingt, als ob Sie einen Handler benötigen - (suchen Sie nach android.os.Handler für Details).

Mit der sendMessageDelayed-Methode können Sie planen, wann die Nachricht an Ihren Handler gesendet wird.

Eine schnelle Suche zog ein vollständiges Beispiel oben, die bekommen sollten Sie begonnen: http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html

+3

Dies ist nicht der beste Weg zu gehen, gibt es viele Situationen, wenn Sie eine sofortige Reaktion auf der Zuhörerseite benötigen, und sendMessageDelayed/Handlers wird unerwünschte Verzögerungen hinzufügen. Der beste Ansatz besteht darin, eine Listener-Schnittstelle zu erstellen und ein Array von Listenern gemäß dem folgenden Beispiel von Sameer zu halten. – radhoo

27

try this:

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

Dieser Ansatz hat den Vorteil der Einfachheit, jedoch erlaubt die Antwort von Sameer, dass mehr als ein Listener für ein gegebenes Ereignis gesetzt wird, eine Lösung, die ich normalerweise empfehle. – radhoo

+0

Danke, es hat für mich funktioniert. Einfach und elegant –

2

Sie verwenden android life cycle für das

.... 
for (listener : listeners) 
{ 
    listener.onNewsUpdate(<News data to be passed>); 
} 
.... 
  • Register Hörer irgendwo verfügbar.

    eine Signalschnittstelle erstellen, auch bekannt als Ihre Veranstaltung

    interface NewsUpdateSignal{ 
        void newsUpdateHandler(Mydata data); 
    } 
    

    als es in Ihrer Aktivität registrieren oder anderswo wollen Sie, könnte es viele Zuhörer zu gleichen Signal sein.

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

    Und senden Sie das Signal, wenn Sie brauchen, von wo immer Sie brauchen.

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

    Haftungsausschluss: Ich bin der Autor von Android Life Cycle.

  • +0

    Dieser ist ziemlich interessant –

    +0

    @DanielCardenas tnx, es ist eigentlich jetzt einfacher (Sie müssen nur eine Schnittstelle für Ihre Veranstaltung erstellen), aktualisierte ich die Antwort, um die neueste Version von Life Cycle zu verwenden –

    Verwandte Themen