android - 如何在 Roboguice 中使用上下文单例

标签 android dependency-injection guice roboguice

我正在使用 @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/

相关文章:

android - 为带轮廓的 Material Components 按钮的背景着色

安卓工作室 : How to create an empty String Array?

android - Google API - YouTube - GuideCategories : list (Android)

android - 如何在kodein中使用带有两个参数的工厂绑定(bind)来恢复对象?

java - 如何将我的类的实例注入(inject)另一个类?

Android - 在特定索引处添加带有布局参数的 subview (在代码中)

dependency-injection - guice注入(inject)器在哪里存放?

java - Guice 中的 JSR-330 支持

java - 优化 @Provides 中的代码以绑定(bind)到我的 guice 包中

Java 配置和依赖注入(inject)(类似于 Springs IoC 与 Weld/Guice)