Android应用程序上的自定义事件侦听器

Android应用程序上的自定义事件侦听器,android,events,event-handling,listener,addeventlistener,Android,Events,Event Handling,Listener,Addeventlistener,我需要设置一个简单的事件侦听器,以便偶尔刷新一次ListView。问题是我不知道如何生成事件 我知道,对于按键或按钮按下之类的事件,我只需要实现处理程序。但在这种特定情况下,我实际上需要生成事件,每当我的应用程序的另一个运行线程唤醒并刷新RSS提要中的新闻列表时,就会触发该事件 我什么都做了,但是被困在这里了。我能得到一些关于如何实现这一点的建议或链接吗?听起来你需要一个处理程序-(详细信息请查阅android.os.Handler) sendMessageDelayed方法将允许您安排将消息发

我需要设置一个简单的事件侦听器,以便偶尔刷新一次
ListView
。问题是我不知道如何生成事件

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


我什么都做了,但是被困在这里了。我能得到一些关于如何实现这一点的建议或链接吗?

听起来你需要一个处理程序-(详细信息请查阅android.os.Handler)

sendMessageDelayed方法将允许您安排将消息发送到处理程序的时间

快速搜索得到了一个完整的示例,应该可以让您开始学习:

尝试以下方法:

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);
   }
}
  • 定义一个回调接口

            public interface NewsUpdateListener 
            {
                void onNewsUpdate(<News data to be passed>);
            }
    
    公共接口NewsUpdateListener { void onNewsUpdate(); }
  • 在获取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);
            }
        ....
        }
    
    类
    {
    ....
    ArrayList侦听器=新的ArrayList();
    .... 
    public void setOnNewsUpdateListener(NewsUpdateListener侦听器)
    {
    //存储侦听器对象
    this.listeners.add(listener);
    }
    ....
    }
    
  • 当新闻可用时触发回调

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

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

    创建一个信号接口,即您的事件

    interface NewsUpdateSignal{
        void newsUpdateHandler(Mydata data);
    }
    
    与在活动中或任何您想要的地方注册到它相比,同一个
    信号可能有许多侦听器

    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 
        }
    }
    
    类MyActivity扩展活动实现NewsUpdateSignal{
    Signal newsUpdateSignal=SignalsBag.inject(NewsUpateSignal.class);
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    newsUpdateSignal.addListener(此);
    }
    @凌驾
    public void newsUpdateHandler(最终Mydata数据){
    //在这里做点什么
    }
    }
    
    当你需要的时候,从你需要的地方发出信号

    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);
        }        
    }
    
    A类{
    Signal newsUpdateSignal=SignalsBag.inject(NewsUpateSignal.class);
    void execute(){
    //以某种方式获取数据并进行调度,回调将在同一线程上调用
    newsUpdateSignal.dispatcher.newsUpdateHandler(数据);
    }        
    }
    

    免责声明:我是安卓生命周期的作者。

    这种方法具有简单的优点,但是Sameer的回答允许为一个给定事件设置多个侦听器,这是我通常推荐的解决方案。这不是最好的方法,在很多情况下,您需要侦听器方面的快速反应,sendMessageDelayed/Handler将添加不必要的延迟。最好的方法是按照下面Sameer的例子创建一个listner接口并保存一个侦听器数组。你能详细说明一下不同的代码段放在哪里吗?@FireFly3000:我认为代码段2是一个java类,你希望有一个事件,代码段1可以在一个单独的文件中,或者是2的子类。代码段3应该是代码段2的成员。代码片段4出现在想要收听该事件的类中。感谢您提供的很棒的解决方案。什么是注销侦听器的适当时间?由于您每次都要将侦听器添加到arrayList中,您将在何时删除侦听器?这一个非常好interesting@DanielCardenastnx,现在实际上更简单了(您只需要为您的事件创建一个接口),我更新了答案以使用最新版本的生命周期