你如何使用Guice在Android Activity中注入一些接口的impl

时间:2011-11-26 09:32:48

标签: java android guice roboguice

我在Android上使用Guice 3.0来做一些DI。

我有

public interface APIClient { }

public class DefaultAPIClient implements APIClient { }

我所做的是尝试在我的MyApplication类中引导Guice,为它提供一个在configure方法bind(APIClient.class).to(DefaultAPIClient.class);中有一个语句的模块

我做了Guice的例子告诉我做的事情

Injector injector = Guice.createInjector(new APIClientModule());
injector.getInstance(APIClient.class);

我可能没有正确理解这一点,但是我如何将APIClient注入到将要使用它的几个活动中呢?

我在HomeActivity

中这样做了
public class HomeActivity extends RoboActivity {
    @Inject APIClient client;

    protected void onCreate(Bundle savedInstanceState) {
        client.doSomething();
    }
}

这不起作用,它给了我Guice configuration errors: 1) No implementation for com.mycompany.APIClient was bound

所以我能够让这个工作的唯一方法是从HomeActivity中的APIClient客户端删除@Inject并使用client = Guice.createInjector(new APIClientModule()).getInstance(APIClient.class);

注入它

这是否意味着我必须在每个使用API​​Client的Activity中执行此操作?我一定是做错了。

任何帮助都会很棒。谢谢!

3 个答案:

答案 0 :(得分:4)

如果您使用Roboguice 2.0和Guice 3.0_noaop,定义其他自定义模块的方法是通过字符串数组资源文件roboguice_modules:

来自文档(Upgradingto20):

  

由于该类已经消失,因此不再需要/可能继承RoboApplication。如果要覆盖默认的RoboGuice绑定,可以在res / values / roboguice.xml中名为“roboguice_modules”的字符串数组资源中指定自定义模块类名。例如

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <string-array name="roboguice_modules">
        <item>PACKAGE.APIClientModule</item>
    </string-array>
</resources>

因此,您需要按如下方式定义自定义模块:

roboguice_modules:

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <string-array name="roboguice_modules">
        <item>DONT_KNOW_YOUR_PACKAGE.APIClientModule</item>
    </string-array>
</resources>

当然,APIClient和DefaultAPIClient之间存在绑定。

和Roboguice应该做其余的事。

答案 1 :(得分:4)

非常感谢Groupon的Michael Burton在Roboguice mailing list上回答这个问题。对于任何感兴趣的人,以下是如何以编程方式执行此操作。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(this)).with(new MyCustomModule()));
    }
}

现在我可以在Activity中正确地注入@Inject private APIClient client

答案 2 :(得分:-1)

您应该使用Guice 2.0(no aop)代替Guice 3.0

要正确配置Guice,您需要在应用程序类中覆盖addApplicationModules(List<Module> modules)方法并在那里添加模块。

public class MyApplication extends RoboApplication {
  @Override
  protected void addApplicationModules(List<Module> modules) {
    modules.add(new YourModule());
  }

要在您的活动中使用注射,您需要致电super.onCreate(savedInstanceState) 因为成员是用RoboActivity的onCreate方法注入的。

public class HomeActivity extends RoboActivity {
    @Inject APIClient client;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // Call this before use injected members
        client.doSomething();
    }
}