【问题标题】:how can I set up multiple listeners for one event?如何为一个事件设置多个侦听器?
【发布时间】:2011-03-28 21:19:31
【问题描述】:

我想为一个事件设置多个监听器,发现使用复合监听器是关键。

谁能给我一个例子?

【问题讨论】:

    标签: android composite


    【解决方案1】:
    class CompositeListener implements OnEventListener {
       private List<OnEventListener> registeredListeners = new ArrayList<OnEventListener>();
    
       public void registerListener (OnEventListener listener) {
          registeredListeners.add(listener);
       }
    
       public void onEvent(Event e) {
          for(OnEventListener listener:registeredListeners) {
             listener.onEvent(e);
          }
       }
    }
    

    .....

    CompositeListener composite = new CompositeListener();
    composite.registerListener(listener1);
    composite.registerListener(listener2);
    component.setOnEventListener(composite);
    

    【讨论】:

    • 您可能想要添加一个删除方法,因为这也是模式的一部分。
    【解决方案2】:

    你可以试试这个技巧 您将需要扩展视图,例如扩展 Button 以接受多个 onclick 侦听器。 你创建一个实现 OnclickListener 的内部类

    private class OnclickListenerCollection implements OnClickListener{
        private ArrayList<OnClickListener> listeners;
    
        public void addOnclickListener(OnClickListener listener){
            listeners.add(listener);
        }
    
        @Override
        public void onClick(View v) {
            for(OnClickListener l : listeners){
                l.onClick(v);
            }
    
        }
    }
    

    在子类按钮的构造函数中,调用 super.setOnclickListener 传递内部类的实例

    private OnclickListenerCollection listenerCollector;
    

    在您的构造函数中:

    listenerCollector = new OnclickListenerCollection();
    super.setOnClickListener(listenerCollector);
    

    您重写 setOnclickListener 方法以将侦听器添加到集合中

    @Override
    public void setOnClickListener(OnClickListener l) {
    
        listenerCollector.addOnclickListener(l);
    }
    

    我没有尝试过,但我相信它会起作用

    【讨论】:

    • 我不会把这称为 hack。
    • 这是个好主意。恕我直言,只需稍作改动即可改进。如前所述,它改变了setOnClickListener 的含义。如果改为实现两个名称说明其功能的方法,则含义会更清楚:addOnClickListenerremoveOnClickListener
    【解决方案3】:

    我知道这已经晚了几年,但想添加我刚刚花了几个小时上班的版本。这是位于文件 DBupdateEventListener.java 中的代码:

    public interface DBupdateEventListener {
        public void onUpdateChannelSubscriptions();
    }
    class DBupdateEventListenerRegistry implements DBupdateEventListener{
        public static List<DBupdateEventListener> registeredListeners = new ArrayList<DBupdateEventListener>();
        public void registerListener(DBupdateEventListener listener){
            registeredListeners.add(listener);
        }
        public void onUpdateChannelSubscriptions(){
            for (DBupdateEventListener listener:registeredListeners){
                listener.onUpdateChannelSubscriptions();
            }
        }
    }
    

    registeredListeners 是一个公共静态变量是非常重要的。这就是我在这个问题已经关闭几年后添加自己的答案的全部原因。

    这是我在事件触发后需要更新的片段的 OnCreate() 方法中使用的代码:

            dbUpdater = new DBupdateEventListener() {
                @Override
                public void onUpdateChannelSubscriptions() {
                    //put the code you want to run when the event is triggered here:
                    loadChannelListsFromDB();
                }
            };
            DBupdateEventListenerRegistry temp = new DBupdateEventListenerRegistry();
            temp.registerListener(dbUpdater);
    

    这是我的异步任务中使用的代码,它首先触发了事件:

    dbUpdaterRegistry = new DBupdateEventListenerRegistry();
    dbUpdaterRegistry.onUpdateChannelSubscriptions();
    

    【讨论】:

    • registeredListeners 仅需要为 static,前提是它不是已知对象上的字段,只要需要,它就会一直存在。 static 的一个缺点是,只要您的应用程序还活着,它就会一直存在。虽然有时这很好,但它不是您想要养成使用习惯的“食谱”。 static 的第二个缺点是现在您不能创建该类的两个实例,每个实例都有自己的一组侦听器。相反,在活动/片段中,有一个 字段 DBupdateEventListenerRegistry eventRegistry;,用于该活动的侦听器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多