您如何处理没有明确取消订阅的情况?
在Android的BroadcastReceiver中,没有生命周期结束方法可以调用EventBus取消订阅。可以多次调用此BroadcastReceiver。由于没有取消注册,事件会在第一个事件之后以指数方式(实际上是算术上)触发更多操作,因为我们在初始化方法(onReceive)中再次注册。
我猜这种情况很常见,可以在这里讨论。
我们正在检查某个特定事件是否有现有订阅者,然后在没有订阅者时注册到该总线。
这似乎是一种hackish和一种不可靠的方法。例如,如果代码的另一部分开始依赖于同一事件并且也必须注册,该怎么办?我们已经在新地点的公交车上安装了一个用户,我们的旧代码无法注册。我们的逻辑将失败或将变得更加复杂,并与订户数量等紧密耦合。
请指出问题是否容易理解,我或许可以尝试不同的解释方法。
答案 0 :(得分:1)
广播接收器由Android创建,用于处理一个广播。它们在主线程上运行,该线程也处理UI。因此,它们应该非常快速地运行,绝对不能执行任何长时间运行的任务或访问网络。
鉴于此,他们根本没有注册事件总线是没有意义的。
相反,您的广播接收器应该只是在Android服务上开始一些工作,具有定义的生命周期,是注册事件总线的好选择。
答案 1 :(得分:0)
好的,我来这里回答。
第一:
可以多次调用此BroadcastReceiver。既然有 没有取消注册,事件以指数方式触发(实际上 算术上)第一次事件后的更多行动
我不知道你使用哪个EventBus。但如果EventBus对您的订阅者有强烈的引用,那么如果您无法取消订阅,则会出现内存泄漏。这也可能是你的BCR多次注册的原因,因为实例在调用onReceive
方法之后实际上并没有被破坏(但应该是)(只是一个理论,待确认)。
如果您在BCR收到某些内容后必须执行长任务,请启动Service。只要任务未完成,服务就会运行(实际上,您也可以让它处理自己的生命周期)。 Service
的设计目的是为了满足目的并且是订阅EventBus的合适人选,因为它实际上已经定义了生命周期,这意味着您可以轻松订阅和取消订阅。
我不确定您是否理解与以下相关的问题:
这似乎是一种hackish和一种不可靠的方法。具体而言,什么 如果代码的另一部分开始依赖于同一事件 还必须注册?我们已经在公交车上有一个用户 从新的位置,我们的旧代码不会注册自己。