1

我正在学习使用 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?

4

3 回答 3

9

是的,在使用 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 框架为您实例化您的对象来鼓励良好的实践。

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

于 2011-12-20T18:29:15.777 回答
1

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

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

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

bind(TelephonyManager.class).toProvider(new SystemServiceProvider<TelephonyManager>(Context.TELEPHONY_SERVICE));
于 2012-04-04T13:37:55.740 回答
1

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

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

只需要上下文

于 2013-08-30T23:26:57.480 回答