Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Guice在Android活动中注入一些接口的impl_Java_Android_Guice_Roboguice - Fatal编程技术网

Java 如何使用Guice在Android活动中注入一些接口的impl

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

我正在Android上使用Guice3.0来做一些DI

我有

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()));
    }
}