【问题标题】:RoboGuice and static variable InjectionsRoboGuice 和静态变量注入
【发布时间】:2012-12-12 19:51:38
【问题描述】:

我在一个项目中第一次使用 RoboGuice,并试图注入一个静态变量,但该变量仍然为空。这是我正在测试的东西的快速模型:

public class MyActivity extends RoboFragmentActivity {

    @Override protected void onCreate(Bundle savedInstanceState) {
      MyObject.print();
    }
}


@ContextSingleton
public class MyObject {

    @Inject static AssetManager sAssetManager;

    public static void print() {
      if(sAssetManager == null) {
        Log.d("debug", "AssestManager is null");
      } else {
        Log.d("debug", "AssetManager was injected");
      }
  }
}

我怎样才能做到这一点?

阅读

我知道这不是最佳实践 - 这更像是一个使用 RoboGuice 的学习练习。仅在您对给出的问题有答案时才回答,而不是“您为什么要这样做”。

【问题讨论】:

    标签: android dependency-injection guice roboguice


    【解决方案1】:

    您为什么使用static 方法/变量?这不是正确的做法。您应该将@Inject MyObject 注入MyActivity。然后你可以做myObjectInstance.print();。请注意,RoboGuice 在setContentView() 之后执行注入,除非您强制执行。

    【讨论】:

    • 感觉这种类型的答案即将到来。我通常不会这样做。我需要这个的原因很难解释,这只是一个简单的例子以及学习 RoboGuice 的经验。显然我知道我通常不会这样做。只是寻找这个问题的答案 - 不是最佳做法。
    • 我认为在 SO 中我们通常会假设最坏的情况。无论如何,我相信您仍然需要先注入MyObject,以便注入字段。你试过了吗?
    • 是的 - 所以我只想在这种情况下注入 AssetManager 对象。但由于某种原因,它仍然为空......不确定是因为“静态”关键字,还是因为 MyObject 找不到上下文 - 但是我认为 AssetManager 的提供者只是使用了应用程序上下文.
    • 似乎AssetManagerProvider 正在使用上下文,这意味着它不是应用程序。您可以将其与使用应用程序上下文的ResourcesProvider 进行比较。
    • 哇,我当时看错了,出于某种原因,我认为这是应用程序。但是,如果我执行“@Inject Application”而不是“@Inject AssetManager”,我仍然会遇到同样的问题。这有什么原因吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多