Java 如何使用Guice在Android活动中注入一些接口的impl
我正在Android上使用Guice3.0来做一些DI 我有Java 如何使用Guice在Android活动中注入一些接口的impl,java,android,guice,roboguice,Java,Android,Guice,Roboguice,我正在Android上使用Guice3.0来做一些DI 我有 public interface APIClient { } 及 我所做的是尝试在MyApplication类中引导Guice,给它一个模块,该模块在configure方法bind(APIClient.class).to(DefaultAPIClient.class)中有一条语句 我做了Guice示例让我做的事情 Injector injector = Guice.createInjector(new APIClientModule
public interface APIClient { }
及
我所做的是尝试在MyApplication类中引导Guice,给它一个模块,该模块在configure方法bind(APIClient.class).to(DefaultAPIClient.class)中有一条语句代码>
我做了Guice示例让我做的事情
Injector injector = Guice.createInjector(new APIClientModule());
injector.getInstance(APIClient.class);
我可能没有正确地理解这一点,但如何将ApicClient注入到将使用它的几个活动中呢
我在HomeActivity
public class HomeActivity extends RoboActivity {
@Inject APIClient client;
protected void onCreate(Bundle savedInstanceState) {
client.doSomething();
}
}
这不起作用,它给了我Guice配置错误:1)没有绑定com.mycompany.APIClient的实现
因此,我能够实现这一点的唯一方法是在HomeActivity中从APIClient客户端删除@Inject
,并使用client=Guice.createInjector(新的APIClientModule()).getInstance(APIClient.class)进行注入代码>
这是否意味着我必须在使用ApicClient的每个活动中都这样做?我一定是做错了什么
任何帮助都会很好。谢谢 您应该使用而不是Guice 3.0
要正确配置Guice,您需要覆盖应用程序类中的addApplicationModules(列出模块)
方法,并在其中添加模块
public class MyApplication extends RoboApplication {
@Override
protected void addApplicationModules(List<Module> modules) {
modules.add(new YourModule());
}
如果将Roboguice 2.0与Guice 3.0_noaop一起使用,则定义其他自定义模块的方法是通过字符串数组资源文件Roboguice_模块:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="roboguice_modules">
<item>DONT_KNOW_YOUR_PACKAGE.APIClientModule</item>
</string-array>
</resources>
从文档()中:
自从RoboApplication类消失后,不再需要/可能从该类继承。如果希望覆盖默认RoboGuice绑定,可以在res/values/RoboGuice.xml中名为“RoboGuice_modules”的字符串数组资源中指定自定义模块类名。例如
PACKAGE.APIClientModule
因此,您需要按如下方式定义自定义模块:
roboguice_模块:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="roboguice_modules">
<item>DONT_KNOW_YOUR_PACKAGE.APIClientModule</item>
</string-array>
</resources>
不知道您的包。APIClientModule
当然,APIClient和DefaultAPIClient之间具有约束力
Roboguice应该做剩下的事。非常感谢Groupon的迈克尔·伯顿在网上回答了这个问题。对于任何感兴趣的人来说,下面是如何通过编程实现这一点
public class MyApplication extends Application {
@Override
public void onCreate() {
RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(this)).with(new MyCustomModule()));
}
}
现在我可以在活动中正确地注入@inject private APIClient client
。Ah。我之所以使用Guice 3.0,是因为Roboguice 1.2现在支持Guice 3。RoboApplication已被弃用,现在不需要addApplicationModules调用。当然,只有在没有自定义模块的情况下才可以。在我的例子中,我这样做了,我查找了它,您必须在roboguice.xml中添加模块,但我正在寻找一种java方法来实现这一点,并尝试尽可能远离xml。如果您对在java中添加自定义模块有任何想法,请告诉我。谢谢。哦,对不起。我是说我用的是roboguice 2.0b3而不是1.2我在研究的时候遇到过。有没有一种方法可以通过编程而不是在XML中实现这一点?我可以追踪代码,但我想我会问你是否有一个快速的答案。感谢您在普通的旧java中配置roboguice自定义模块而不修改roboguice是不可能的。下面是查找您定义的模块的代码:第101行+检查RoboGuice.setBaseApplicationInjector(…),以编程方式在2.0中设置模块。您需要为您的应用程序调用一次,这样您就可以使用静态初始值设定项或从自定义应用程序类调用它。我站在正确的位置,应该向上滚动一点;-)。。。您是在重写的应用程序中定义它,还是有更好的地方来定义它?
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="roboguice_modules">
<item>DONT_KNOW_YOUR_PACKAGE.APIClientModule</item>
</string-array>
</resources>
public class MyApplication extends Application {
@Override
public void onCreate() {
RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, Modules.override(RoboGuice.newDefaultRoboModule(this)).with(new MyCustomModule()));
}
}