I cannot make Guice Multibindings work with RoboGuice.
When my activity extends android Activity, multibindings work just fine. When my activity extends RoboActivity, multibindings do not work, and the following exception is thrown:
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 project I've created declares following Gradle dependencies:
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'
}
}
The module is as follows (part of 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()));
}
});
If I invoke 'gradle -q :app:dependencies' I receive:
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
but still I've got dalvik error:
com.android.dex.DexException: Multiple dex files define Lcom/google/inject/Module;
When I test 'guice-3.0-no_aop' library, 'com.google.inject.Module' class is both in 'guice-3.0-no_aop' and 'roboguice-3.0.1'.
I'm pretty stuck here :)