【问题标题】:Android app with RoboGuice 2.0 - How to inject a Singleton with the Application context带有 RoboGuice 2.0 的 Android 应用程序 - 如何使用应用程序上下文注入单例
【发布时间】:2012-12-18 22:06:22
【问题描述】:

我有一个 GameStateManager 单例,我希望它可用于我的所有活动。特别是我希望它使用应用程序上下文而不是单个活动上下文来监听 EventManager 触发的事件。

GameStateManager 用单例注释标记

我尝试在 Application.OnCreate 期间注入 GameStateManager (对不起,下面的sn-p是凭记忆打的,不是复制粘贴的,可能有误)

public void OnCreate(){
    GameStateManager gameStateManager = RoboGuice.InjectMembers(this.getApplicationContext(), new GameStateManager())

}

我认为 GameStateManager 的实例将使用应用程序上下文构建,并且由于它被注释为单例,因此稍后可以使用应用程序上下文。我注意到,当我将 GameStateManager 注入到一个活动中时,我实际上得到了一个与活动上下文相关联的新单例。所以本质上我有2个单身人士:)

关于如何拥有连接到应用程序上下文的真正“单例”的任何想法?

谢谢!

【问题讨论】:

    标签: android dependency-injection guice roboguice


    【解决方案1】:

    您观察到的问题可能是由于开发模式下的延迟初始化(请参阅https://code.google.com/p/google-guice/wiki/Scopes)引起的。

    如果您首先在活动中注入您的经理,它会在此时延迟创建。由于Activity 满足任何@Inject Context,活动被注入。这实际上是非常有害的,因为如果你的 manager 用 @Singleton 注释,它的寿命比 Activity 长,你基本上只是造成了内存泄漏。

    我发现它对@Inject ApplicationActivity 更明确,具体取决于我期望注入的位置(Activity 通常用于@ContextSingletonApplication 用于普通@Singleton )。

    【讨论】:

      【解决方案2】:

      由于 RoboGuice 是在 Guice 下构建的,因此您可以尝试使用 @Singelton 注释来保证每个 Injector 一个实例

      看看example application

      【讨论】:

      • 我试过了,但没有用。如果我没记错的话,ContextSingleton 不是每个上下文都给你一个单例,这实际上也是我在单例中看到的体验
      • javadoc 说它应该是单一的上下文。打算多去搜索。因此,到目前为止,请删除此答案。
      • 随意删除,我没有那个选项
      • 这就是我尝试过的(使用@Singleton)。也许我不明白 Android 应用中的“per Injector”是什么意思。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多