在 Android 应用程序上创建自定义事件监听器

42

我需要设置一个简单的事件监听器,定期刷新 ListView。问题是我不知道如何生成事件。

我知道对于像按键或按钮按下这样的事件,我只需要实现 Handler。但在这种特定情况下,我实际上需要生成事件,每当我的应用程序的另一个运行线程唤醒并从 RSS 源刷新其新闻列表时,就会触发该事件。

我已经做了一切,但卡在这里了。我能否获得有关如何实现此操作的更多信息?

4个回答

90
  1. 定义一个回调接口

            public interface NewsUpdateListener 
            {
                void onNewsUpdate(<News data to be passed>);
            }
    
  2. 在后台线程上提供注册功能,获取RSS源

  3.     class <Background processing class name> 
        {
        ....
            ArrayList<NewsUpdateListener> listeners = new ArrayList<NewsUpdateListener> ();
        .... 
            public void setOnNewsUpdateListener (NewsUpdateListener listener) 
            {
                // Store the listener object
                this.listeners.add(listener);
            }
        ....
        }
    
  4. 有新闻时触发回调函数

  5. ....
    for (listener : listeners) 
    {
        listener.onNewsUpdate(<News data to be passed>);
    }
    ....
    
  6. 在初始化期间某处注册监听器

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

你能详细说明在哪里放置不同的代码片段吗? - 7heViking
@FireFly3000:我认为Snippet 2是一个你想要有事件的Java类,Snippet 1可以在一个单独的文件中或者是Snippet 2的子类。Snippet 3应该是Snippet 2的成员。Snippet 4放在想要监听事件的类中。 - Mooing Duck
感谢您提供的出色解决方案。那么,注销侦听器的适当时间是什么?由于每次都将侦听器添加到ArrayList中,您何时会删除侦听器? - Muhammad Riyaz

28

尝试这个:

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
这种方法具有简单性优势,然而Sameer的答案允许为一个给定事件设置多个侦听器,这是我通常推荐的解决方案。 - radhoo

3

3
这并不是最佳方法,因为在许多情况下需要在听众方面迅速响应,而sendMessageDelayed/Handlers会添加不必要的延迟。最好的方法是按照Sameer的示例创建一个监听器接口,并持有一个监听器数组。 - radhoo

2
你可以使用Android生命周期来完成这项任务。
创建一个信号接口,也就是你的事件。
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生命周期的作者。


这个很有趣。 - Daniel Cardenas
@DanielCardenas 谢谢,现在它实际上更简单了(你只需要为你的事件创建一个接口),我更新了答案以使用最新版本的生命周期。 - Ilya Gazman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接