web-dev-qa-db-fra.com

Écouteur d'événements personnalisé sur Android

J'ai besoin de configurer un simple écouteur d'événements pour actualiser un ListView de temps en temps. Le problème est que je ne sais pas comment générer un événement.

Je sais que pour des événements comme la pression d'une touche ou d'un bouton, j'ai juste besoin d'implémenter le Handler. Mais dans ce cas spécifique, j'ai besoin de générer l'événement, qui sera déclenché chaque fois qu'un autre thread en cours d'exécution de mon application se réveillera et actualisera sa liste de nouvelles à partir d'un flux RSS.

J'ai tout fait, mais je suis coincé ici. Puis-je obtenir une suggestion ou un lien avec plus d'informations sur la façon de mettre en œuvre cela?

42
Bilthon
  1. Définir une interface de rappel

            public interface NewsUpdateListener 
            {
                void onNewsUpdate(<News data to be passed>);
            }
    
  2. Fournir une fonction d'enregistrement sur le fil d'arrière-plan qui obtient le flux RSS

        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. Déclencher le rappel lorsque des nouvelles sont disponibles

    ....
    for (listener : listeners) 
    {
        listener.onNewsUpdate(<News data to be passed>);
    }
    ....
    
  4. Enregistrer l'auditeur quelque part pendant l'initialisation

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

essaye ça:

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);
   }
}
28
Hojjat
3
Colin Stewart

Vous pouvez utiliser cycle de vie Android pour cela.

Créez une interface de signal, alias votre événement

interface NewsUpdateSignal{
    void newsUpdateHandler(Mydata data);
}

Au lieu de vous y inscrire au sein de votre activité ou n'importe où ailleurs, il peut y avoir plusieurs auditeurs sur le même 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 
    }
}

Et envoyez le signal quand vous en avez besoin, d'où que vous ayez besoin.

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

Clause de non-responsabilité: je suis l'auteur de Android cycle de vie.

2
Ilya Gazman