【发布时间】: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()
}
}
当我只需要使用其中一个侦听器时,这很有效,当我使用来自不同Activities 的setOnFavsChangedListener 时,它们将覆盖最后一个。
我的想法是使用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