Пользовательский прослушиватель событий в приложении Android - PullRequest
42 голосов
/ 06 июня 2010

Мне нужно настроить простой приемник событий, чтобы время от времени обновлять ListView. Проблема в том, что я не знаю, как создать событие.

Я знаю, что для таких событий, как нажатие клавиш или кнопок, мне просто нужно реализовать Handler. Но в этом конкретном случае мне действительно нужно сгенерировать событие, которое будет запускаться каждый раз, когда другой запущенный поток моего приложения просыпается и обновляет свой список новостей из ленты RSS.

Я сделал все, но застрял здесь. Могу ли я получить какое-либо предложение или ссылку с дополнительной информацией о том, как это реализовать?

Ответы [ 4 ]

90 голосов
/ 05 февраля 2012
  1. Определить интерфейс обратного вызова

            public interface NewsUpdateListener 
            {
                void onNewsUpdate(<News data to be passed>);
            }
    
  2. Предоставить средство регистрации в фоновом потоке, который получает канал 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. Запустить обратный вызов при наличии новостей

    ....
    for (listener : listeners) 
    {
        listener.onNewsUpdate(<News data to be passed>);
    }
    ....
    
  4. Зарегистрировать слушателя где-нибудь во время инициализации

    ....
        <class <Background processing class object>.registerListener
    (
        new OnNewsUpdateListener() {
            onNewsUpdate(<News Data>) {
                // process news data
                runOnUIThread(new Runnable() {
                    public void run() {
                        // refresh list view
                    }
                }
            }
    }
    ....
    
28 голосов
/ 05 февраля 2012

попробуйте это:

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 голосов
/ 07 июня 2010

Звучит так, как будто вам нужен обработчик - (смотрите подробности на android.os.Handler).

Метод sendMessageDelayed позволит вам планировать отправку сообщения вашему обработчику.

В результате быстрого поиска был найден полный пример, с которого можно начать: http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html

2 голосов
/ 15 февраля 2015

Для этого можно использовать жизненный цикл андроида .

Создайте интерфейс сигнала, он же ваше событие

interface NewsUpdateSignal{
    void newsUpdateHandler(Mydata data);
}

Если зарегистрировать его в своей деятельности или в другом месте, где вы хотите, может быть много слушателей того же 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 
    }
}

И отправляйте сигнал тогда, когда вам нужно, откуда угодно.

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

Отказ от ответственности: я являюсь автором жизненного цикла Android.

...