我正在使用 @ContextSingleton
来标记依赖于上下文注入(inject)的单例。从查看 RoboGuice 源代码和我自己的测试来看,它似乎在 Application
上下文和不同的 Activity 上下文之间产生了差异。这是完全有道理的,只是当我将它与这样的事件管理工具一起使用时,它是 - 至少对我来说 - 有问题:
@ContextSingleton
public class Service {
@Inject
private Context context;
public void doSomething(@Observes MyEvent ev) {
...
}
}
虽然该服务被定义为单例,但在它第一次被注入(inject)某个地方之前似乎没有创建它的实例,显然是通过延迟加载。因此触发 MyEvent
不会调用监听器。我们认为我们可以在我们的应用程序中预先“手动”预加载类
RoboGuice.get(context).getInstance(Service.class);
因此注册了监听器,但这只有在 Activity 中执行时才能正常工作,该 Activity 随后还注入(inject)了 EventManager
以触发事件,但不是应用程序。
因此,在理想情况下,我希望我可以告诉 RoboGuice 应该将单例绑定(bind)到哪个上下文,就像这样
@ContextSingleton(MyApplication.class)
public class Service {
...
}
但显然这是不可能的。
我错过了什么?
最佳答案
我认为您没有注意到事件不会跨上下文传播并且是特定于上下文的 - 请参阅(旧的,但仍然有效)events documentation 中的“需要注意的事项”部分.因此,即使您的单例加载到应用程序上下文中,它也无法知道每个 Activity 的上下文中发生的事件。我认为他们这样做有充分的理由,但也许如果您将 Application
子类化,您可以在那里注入(inject)一个 EventManager
以便全局访问。
我还没有尝试过,所以我不确定它是否会起作用,无论如何你必须将事件注入(inject)到不同的 EventManager 中,所以你最好为此定义一个接口(interface)单例并以这种方式使用它,因为事件不会按照您希望的方式传播。
关于android - 如何在 Roboguice 中使用上下文单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12514714/