【问题标题】:Multiple listeners in one class一个类中有多个听众
【发布时间】:2013-06-07 12:15:06
【问题描述】:

我想每个人都知道监听器接口模式。我有一堂课,里面有一些用户可以添加或删除的最喜欢的项目。

在这堂课中我有:

public static OnFavsChangedListener onFavsChangedListener; 

public interface OnFavsChangedListener {
    abstract void onFavsChanged();
}

public static void setOnFavsChangedListener(
        OnFavsChangedListener listener) {
    onFavsChangedListener = listener;
}

public void addToFavorites () {
    if (onFavsChangedListener != null) {
        onFavsChangedListener.onFavsChanged()
    }
}

当我只需要使用其中一个侦听器时,这很有效,当我使用来自不同ActivitiessetOnFavsChangedListener 时,它们将覆盖最后一个。

我的想法是使用ArrayList 的听众并在我的收藏发生变化时调用它们,但很难不让ArrayList 变得太大(Activities 可能会在每次方向变化时添加一个听众/@ 987654327@)。我可以使用 HashMap 的 ID 和监听器,让每个 Activity 删除它的监听器 onDestroy,但这似乎很笨拙。

TL;DR:当我的收藏发生变化时,通知几个Activities 的优雅方式是什么?

【问题讨论】:

  • 什么是管理“收藏夹”? IOW,在你的场景中谁会打电话给addToFavorites()
  • 我打算建议 bclymer 在他的回答中所说的,使用公共汽车来解决这个问题。如果您不想这样做,典型的模式是使用侦听器的集合,并且侦听器需要在完成后注销自己(这是错误/泄漏的常见原因,但它通常是这样工作的,那就是首选总线的原因之一——总线也少了很多代码)。
  • @CommonsWare addTofavorites 也可以从不同的活动中调用。这是一个公共静态方法。不过,我已经处理了可能的 ConcurrentModificationExceptions。
  • 是的,我同意使用事件总线的建议。我没有使用过 greenrobot 的 EventBus,尽管我成功地使用了 Square 的 Otto。不过,无论是在 onDestroy() 还是其他生命周期方法中,您仍然应该主动从总线上取消注册。

标签: android interface listener


【解决方案1】:

这对于您的用例来说可能有点过头了,但为了通知类有关事件,我使用事件总线(特别是 https://github.com/greenrobot/EventBus)。

这使您可以简单地发布一条消息,并且每个注册接收该类型消息的类都会收到它。使用起来非常简单,就库而言非常小。

【讨论】:

  • 我一定会看看的,因为我只发布了一个简化版本,实际上我有不同的收藏夹列表,要订购的物品等,所以这可能会为我节省一些麻烦跑步。感谢您的提议。
  • 很高兴你喜欢它,我自己也很喜欢它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
相关资源
最近更新 更多