【问题标题】:Roboguice injecting system serviceRoboguice 注入系统服务
【发布时间】:2011-12-20 17:14:25
【问题描述】:

我正在学习使用 Roboguice,但在理解如何注入系统服务时遇到了一些麻烦。我见过的所有例子都是注入一个活动,但我想把它注入一个 POJO。我正在使用 Roboguice 2.0 beta 3

我有一个 PhoneNumber 类并想注入 TelephonyManager 服务。

public class PhoneNumber {
    @Inject TelephonyManager mTelephonyManager;

    protected Integer getNetworkCountryPrefix() {

        // This gives a null pointer exception 
        mTelephonyManager.getNetworkCountryIso();
    }
}

注入到扩展 RoboActivity 的类时,一切正常。但是是否可以在不扩展 RoboActivity 的类中注入 TelephonyManager?

【问题讨论】:

    标签: android dependency-injection guice roboguice


    【解决方案1】:

    是的,在使用 RoboGuice 时,可以通过三种主要方式在对象中注入。

    1. 自己调用 RoboGuice.injectMembers() 以获取要在其上执行注入的对象。对于大多数 POJO,这可能在对象的构造函数中完成,但也可以在其他时间完成。请注意,这是一个完美的解决方案,但可能是最不理想的选项,因为它硬编码了对您的 DI 框架 (RoboGuice) 的依赖项。

    2. 注入一个已经为你做 #1 的类。你已经熟悉这种方法了……这正是 RoboActivity 所做的。基本上,RoboActivity 所做的大部分工作只是为您调用 RoboGuice.injectMembers。

    3. 将 TelephonyManager 注入到本身已注入的类中。这通常是最理想的,尽管在您的特定情况下可能不理想。让我在下面解释一下:

      class MyActivity extends RoboActivity {
          @Inject PhoneNumber phone;
      
          ...
      }
      
      class PhoneNumber {
          @Inject TelephonyManager tm;
      }
      

      基本上,RoboGuice 只需要有机会在您的实例上执行注入。对于不是由 RoboGuice 创建的普通 POJO,除非您直接调用 injectMembers,否则 RoboGuice 没有机会发挥其魔力,因此解决方案 #1。但是,如果您允许 RoboGuice 为您实例化一个对象,例如。通过注入它,RoboGuice 可以控制对象的创建,并可以在该对象中为您进行注入。因此,在上面的示例中,当 RoboGuice 创建一个新的 PhoneNumber 并将其放入 phone 变量中时,RoboGuice 将对实例执行注入,tm 将被正确注入。显然,如果您使用 new() 运算符而不是让 RoboGuice 来构造 PhoneNumber,那么 RoboGuice 将没有机会执行注入,并且 tm 将为空。

    如果#3 对你有用,那么我会选择它。这是最灵活的做事方式,它通过让 DI 框架为您实例化您的对象来鼓励良好实践。

    但是,如果电话号码不是您通常让 RoboGuice 为您实例化的东西,那么您可能需要考虑使用选项 #1。

    【讨论】:

      【解决方案2】:

      TelephonyManager 不是可用于注入的默认标准系统服务之一。您必须先在模块中注册该服务,然后才能将其注入其他区域。

      http://code.google.com/p/roboguice/wiki/ProvidedInjections

      通过在您的模块中执行此操作,您可以注册它以进行注入:

      bind(TelephonyManager.class).toProvider(new SystemServiceProvider<TelephonyManager>(Context.TELEPHONY_SERVICE));
      

      【讨论】:

        【解决方案3】:

        你可以在构造函数中使用 this

        RoboGuice.getInjector(context).injectMembers(this);
        

        只需要上下文

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多