我有许多活动可以提高后台工作;活动将在实现侦听器回调时自行传递,以便后台任务可以在活动上引发事件。反过来,活动可以在UI上显示某些内容,以指示后台活动已通过或失败。
或者,我可以使用EventBus,其中我将Activity注册为侦听器/订阅者。我可以让后台任务在EventBus上引发一个事件,而侦听它的Activity可以处理它。
一个优于另一个的优点是什么?你什么时候用一个而不是另一个? (代码清洁度?性能?警告?)
跟进 - 我最终使用了EventBus。代码肯定更清洁,并且没有任何回调挂在外面。 IDE(IntelliJ)认为onEvent
方法未使用,因此我创建了一个注释
@Target({ElementType.METHOD})
public @interface EventBusHook {}
并将其放在我的onEvent
方法上。然后Alt +单击它并要求IntelliJ不将其视为未使用。
@EventBusHook
public void onEvent(MyEventType myEventType){
答案 0 :(得分:33)
我不同意@nnuneoi的回答。
事件总线只有一个优点:它允许组件之间的通信,这些组件是“不知道的”。彼此的存在。
还有一些缺点:
鉴于所有这些缺点,简单的回调应该是默认的实现选择。
只有在不需要直接耦合或难以实现时才应使用事件总线。例如:
Service
向Activity
Fragments
如果通信组件已经意识到"彼此的存在,他们没有必要通过事件总线进行通信。
答案 1 :(得分:21)
使用EventBus的好处:
但不好的是,您可能会对功能声明感到头疼,因为IDE无法帮助您自动完成。
我的建议是,如果您发现必须创建自定义侦听器,那么请考虑使用EventBus,对于大多数(如果不是全部)您的需求/案例,它可能是更好的选择。
无论如何,这毕竟是你的选择=)
答案 2 :(得分:0)
您应该检查您的事件在语义视图中是否是全局唯一的。订阅者是否对该事件感兴趣。如果不是,他就不应该订阅。
如果您确实拥有发布者 - 订阅者关系,事件总线机制是正确的。该事件必须完全独立于接收者。
因此,订阅者因任何责任原因而放弃该事件("即使我已经注册,我也不负责该事件")是一个强烈的指示,即使用事件总线是错误的。那么你应该考虑使用专门的听众。
答案 3 :(得分:0)
由于松散的耦合和更简洁的代码,我会选择EventBus。同样,使用诸如Greenrobot之类的EventBus自动为我完成所有样板工作,并允许我直接从Activity Lifecycle方法(onStart和onDestroy | onStop)注册和注销观察者的事实。实现回调并仍然设法控制这些回调的活动生命周期管理是不必要的麻烦,并且涉及许多不必要的样板。
此外,apparently all garbage collectors think weak reference is great-事件总线为您的观察者和组件提供了确切的信息。它是Observer pattern的基础。