【问题标题】:Guice Extensions MultiBindings not working with RoboActivityGuice Extensions MultiBindings 不适用于 RoboActivity
【发布时间】:2015-04-26 20:29:56
【问题描述】:

我无法让 Guice Multibindings 与 RoboGuice 一起使用。

当我的活动扩展 android 活动时,多重绑定工作得很好。 当我的活动扩展 RoboActivity 时,多重绑定不起作用, 并抛出以下异常:

3450-3450/com.example.guicetest E/AndroidRuntime﹕ FATAL EXCEPTION: main
com.google.inject.ProvisionException:
Unable to provision, see the following errors:
1) Multibinder is not initialized
at com.example.guicetest.MainActivity$1$1.configure(MainActivity.java:35)
(via modules: com.example.guicetest.MainActivity$1$1 ->
com.google.inject.multibindings.Multibinder$RealMultibinder)
while locating java.util.Set<com.example.guicetest.MyInterface>
for parameter 0 at com.example.guicetest.MyFooService.<init>(Unknown Source)
while locating com.example.guicetest.MyFooService
1 error
at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1018)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1044)
at com.example.guicetest.MainActivity$1.onClick(MainActivity.java:41)

我创建的 Android Studio 项目声明了以下 Gradle 依赖项:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.google.guava:guava:18.0'
    compile 'com.android.support:appcompat-v7:22.0.0'
    compile('com.google.inject.extensions:guice-multibindings:4.0-beta5') {
        exclude group: 'com.google.inject', module: 'guice'
    }
    compile('org.roboguice:roboguice:3.0.1') {
        exclude group: 'com.google.inject', module: 'guice'
    }
    provided('org.roboguice:roboblender:3.0.1') {
        exclude group: 'com.google.inject', module: 'guice'
    }
}

模块如下(MainActivity的一部分):

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
     Injector injector = Guice.createInjector(new AbstractModule() {
                @Override
                protected void configure() {
                    bind(MyFooService.class).in(Singleton.class);
                    Multibinder<MyInterface> processors = Multibinder.newSetBinder(binder(), MyInterface.class);
                    processors.addBinding().to(MyBarImpl.class);
                    processors.addBinding().to(MyQuxImpl.class);
                }
            });

            MyFooService fooService =injector.getInstance(MyFooService.class);
            Log.d("TEST", String.valueOf(fooService.implementations.size()));
        }
    });

如果我调用 'gradle -q :app:dependencies' 我会收到:

compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:22.0.0
|    \--- com.android.support:support-v4:22.0.0
|         \--- com.android.support:support-annotations:22.0.0
+--- com.google.inject:guice:3.0
|    \--- javax.inject:javax.inject:1
+--- com.google.inject.extensions:guice-multibindings:3.0
\--- org.roboguice:roboguice:3.0.1

但我仍然遇到 dalvik 错误:

com.android.dex.DexException: Multiple dex files define Lcom/google/inject/Module;

当我测试“guice-3.0-no_aop”库时,“com.google.inject.Module”类同时在“guice-3.0-no_aop”和“roboguice-3.0.1”中。

我被困在这里了 :)

【问题讨论】:

  • 你能把你的模块也包括进来吗?
  • 这可能是因为您将 Guice 3 与 Guice 4 混合使用。
  • @diego 我确定你在com.example.guicetest.MainActivity 中有一个匿名类模块;我可以从您的异常堆栈跟踪中看出。
  • @diego 如果你想包含更多代码,请edit它进入你的原始问题。
  • @Tavian Barnes 如果我切换到 guice-multibindings:3.0 然后我会收到来自 Android Studio 编译器的 java.lang.NoClassDefFoundError: com/google/inject/internal/util/$ImmutableList 。

标签: android guice roboguice


【解决方案1】:

我做到了。 事实证明,至少对我而言,Multibindings 仅适用于 Roboguice 2。 我的 Gradle 配置终于奏效了:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile ('com.android.support:appcompat-v7:22.0.0'){
        exclude group: 'com.google.inject', module: 'guice'
    }
    compile(group: 'com.google.inject', name: 'guice', version: '3.0', classifier: 'no_aop')
    compile('com.google.inject.extensions:guice-multibindings:3.0') {
       exclude group: 'com.google.inject', module: 'guice'
    }
    compile('org.roboguice:roboguice:2.0') {
        exclude group: 'com.google.inject', module: 'guice'
    }
}

如果有人可以评论使用具有更高 Roboguice 版本的 Multibindings,我将不胜感激......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2013-02-09
    • 2017-07-05
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多