Eventbus:如何处理没有明确的取消订阅点?

时间:2015-07-20 08:22:00

标签: android android-broadcast greenrobot-eventbus

广泛的问题

您如何处理没有明确取消订阅的情况?

具体问题

在Android的BroadcastReceiver中,没有生命周期结束方法可以调用EventBus取消订阅。可以多次调用此B​​roadcastReceiver。由于没有取消注册,事件会在第一个事件之后以指数方式(实际上是算术上)触发更多操作,因为我们在初始化方法(onReceive)中再次注册。

我猜这种情况很常见,可以在这里讨论。

潜在解决方案

我们正在检查某个特定事件是否有现有订阅者,然后在没有订阅者时注册到该总线。

这似乎是一种hackish和一种不可靠的方法。例如,如果代码的另一部分开始依赖于同一事件并且也必须注册,该怎么办?我们已经在新地点的公交车上安装了一个用户,我们的旧代码无法注册。我们的逻辑将失败或将变得更加复杂,并与订户数量等紧密耦合。

请指出问题是否容易理解,我或许可以尝试不同的解释方法。

2 个答案:

答案 0 :(得分:1)

广播接收器由Android创建,用于处理一个广播。它们在主线程上运行,该线程也处理UI。因此,它们应该非常快速地运行,绝对不能执行任何长时间运行的任务或访问网络。

鉴于此,他们根本没有注册事件总线是没有意义的。

相反,您的广播接收器应该只是在Android服务上开始一些工作,具有定义的生命周期,是注册事件总线的好选择。

答案 1 :(得分:0)

好的,我来这里回答。

第一:

  

可以多次调用此B​​roadcastReceiver。既然有   没有取消注册,事件以指数方式触发(实际上   算术上)第一次事件后的更多行动

我不知道你使用哪个EventBus。但如果EventBus对您的订阅者有强烈的引用,那么如果您无法取消订阅,则会出现内存泄漏。这也可能是你的BCR多次注册的原因,因为实例在调用onReceive方法之后实际上并没有被破坏(但应该是)(只是一个理论,待确认)。

如果您在BCR收到某些内容后必须执行长任务,请启动Service。只要任务未完成,服务就会运行(实际上,您也可以让它处理自己的生命周期)。 Service的设计目的是为了满足目的并且是订阅EventBus的合适人选,因为它实际上已经定义了生命周期,这意味着您可以轻松订阅和取消订阅。

我不确定您是否理解与以下相关的问题:

  

这似乎是一种hackish和一种不可靠的方法。具体而言,什么   如果代码的另一部分开始依赖于同一事件   还必须注册?我们已经在公交车上有一个用户   从新的位置,我们的旧代码不会注册自己。