2015-04-26 5 views
0

Я не могу заставить Guice Multibindings работать с RoboGuice.Удлинители Guice MultiBindings, не работающие с RoboActivity

Когда моя деятельность расширяет андроидскую активность, многозадачность работает нормально. Когда моя деятельность распространяется RoboActivity, multibindings не работают, и следующее исключение:

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 Студия проект я создал декларирует следующие 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: приложение: зависимости' я получаю:

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 '.

Я довольно застрял здесь :)

+0

Можете ли вы включить и ваш модуль? – durron597

+1

Скорее всего потому, что вы смешиваете Guice 3 с Guice 4. –

+0

@diego Уверен, что у вас есть модуль как анонимный класс в 'com.example.guicetest.MainActivity'; Я могу сказать из вашего исключения stacktrace. – durron597

ответ

0

Я сделал это. Оказывается, по крайней мере для меня, что Multibindings работать только с Roboguice 2. Конфигурация My 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' 
    } 
} 

Я был бы искренне благодарен, если кто-то может прокомментировать, используя Multibindings с более высокими версиями Roboguice ...

Смежные вопросы