【问题标题】:Custom event listener on Android appAndroid 应用上的自定义事件监听器
【发布时间】:2011-02-28 07:43:03
【问题描述】:

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

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

我什么都做了,却卡在了这里。我可以获得任何建议或链接以提供有关如何实施此功能的更多信息吗?

【问题讨论】:

    标签: android events event-handling listener addeventlistener


    【解决方案1】:

    您可以为此使用android life cycle

    创建一个信号接口,也就是你的事件

    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生命周期的作者。

    【讨论】:

    • 这个挺有意思的
    • @DanielCardenas tnx,现在其实更简单了(你只需要为你的事件创建一个界面),我更新了答案以使用最新版本的生命周期
    【解决方案2】:
    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
                      }
                  }
              }
      }
      ....
      

    【讨论】:

    • 你能详细说明一下在哪里放置不同的sn-ps吗?
    • @FireFly3000: 我认为 Snippet 2 是一个你想要有一个事件的java 类,sn-p 1 可以在一个单独的文件中,或者是一个子类2. Snippet 3 应该是 sn-p 的成员 2. Snippet 4 进入想要监听事件的类。
    • 感谢出色的解决方案。什么是取消注册听众的合适时间?由于您每次都将侦听器添加到 arrayList 中,您何时删除侦听器?
    【解决方案3】:

    试试这个:

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

    【讨论】:

    • 这种方法具有简单的优势,但是 Sameer 的回答允许为一个给定事件设置多个侦听器,这是我通常推荐的解决方案。
    【解决方案4】:

    听起来你需要一个 Handler - (查找 android.os.Handler 了解详细信息)。

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

    快速搜索找到了一个完整的示例,可以帮助您入门:http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html

    【讨论】:

    • 这不是最好的方法,有很多情况需要在侦听器端做出及时反应,而 sendMessageDelayed/Handlers 会增加不必要的延迟。最好的方法是创建一个侦听器接口并按照以下 Sameer 的示例保存一组侦听器。
    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2023-03-07
    相关资源
    最近更新 更多