2014-12-08 10 views
5

Właśnie uaktualniłem nasz projekt, aby użyć Roboguice 3 i nagle wszystkie wstrzyknięte obiekty stały się puste, w tym POJO, Dostawcy, Widoki, Zasoby itp. walcząc, aby dowiedzieć się, dlaczego.Wstrzykiwane obiekty stały się puste po uaktualnieniu do Roboguice 3

Przede wszystkim istnieje plik gradle build, włączono i wyłączono Proguard i nie miało to znaczenia. Uważam, że obecnie używamy Roboguice 3.0.1, ale próbowałem 3.0 i nadal miałem problem.

compile ('org.roboguice:roboguice:3.+') { 
    exclude module: 'asm' 
} 
provided 'org.roboguice:roboblender:3.+ 

I mamy pewne niestandardowe powiązania w pliku modułu, więc oto jak ja, określając je według wiki:

<meta-data 
    android:name="roboguice.modules" 
    android:value="com.some.CustomModule"/> 

Tylko dla rekordu Próbowałem również określić w klasie Application to tak i to nie działa:

RoboGuice.getOrCreateBaseApplicationInjector(
        this, 
        RoboGuice.DEFAULT_STAGE, 
        RoboGuice.newDefaultRoboModule(this), 
        new CustomModule(this)); 

to wszystko na ustawieniach, nie zmienia niczego, a jeśli używam Roboguice 2, wszystko działa.

kilka innych rzeczy, które ja również próbowałem:

  1. próbował także bez Roboblender i adnotacji db RoboGuice.setUseAnnotationDatabases(false); nie zrobić różnicę.
  2. te logi są drukowane dobrze, więc myślę, że rzeczywista biblioteka jest zapakowana w prawo.
  3. Zamiast wstrzykiwanie dostawcę POJO, starałem się używać zastrzyk instrukcja jak to RoboGuice.getInjector(this).getInstance(SharedPreferencesHelper.class); i zgłasza błąd o Could not find a suitable constructor in some.path.SharedPreferencesHelper. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. Najdziwniejsze jest to, że w klasie SharedPreferencesHelper mamy publiczny konstruktor z @Inject adnotacją, myślę, że jakoś to nie brane pod uwagę? Może cały ten problem wynika z faktu, że adnotacja nie jest brana pod uwagę?

Od kilku dni walę z tym w głowę i naprawdę doceniam każdy wkład lub więcej rzeczy do wypróbowania.

Odpowiedz

4

Dodanie tego do klasy aplikacji rozwiąże natychmiastowy problem. Powinien także działać, jeśli zostanie dodany do domyślnej akcji uruchamiania.

static { 
    RoboGuice.setUseAnnotationDatabases(false); 
} 

Klasa AnnotationDatabaseImpl jest generowana przez Roboblender podczas kompilacji.

Uzyskanie pracy bazy danych adnotacji:

Kompilator argument „guiceAnnotationDatabasePackageName” decyduje co pakować wygenerowana klasa AnnoationsDatabaseImpl jest przypisany.

Dla Maven buduje:

<plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>${maven-compiler.version}</version> 
       <configuration> 
        <compilerArgument>-AguiceAnnotationDatabasePackageName=some.package.name.here</compilerArgument> 
        <source>${java.version}</source> 
        <target>${java.version}</target> 
        <fork>true</fork> 
       </configuration> 

Następnie w manifeście aplikacji wewnątrz elementu aplikacji dodać tag meta danych, który odwołuje się do wygenerowanego klasę.

<meta-data android:name="roboguice.annotations.packages" android:value="some.package.name.here"/> 

Jeśli dokonać tych zmian i korzystania IntelliJ, a następnie ponownie importowania Maven pom zastosuje te zmiany.Ewentualnie w Intellij można przypisać argument kompilatora, aby utworzyć adnotację.

Byłoby to iść pod dodatkowych parametrów linii poleceń w menu Ustawienia/Build, egzekucji Wdrożenie/Java Compiler

-AguiceAnnotationDatabasePackageName = some.package.name.here

Nadzieja to pomaga i pozwala uniknąć pewnych żal :)

3

otrzymuję ten sam błąd podczas używania go z Gradle i Android Studio

i dodaje następujące do build.gradle pliku:

allprojects { 
    gradle.projectsEvaluated { 
     tasks.withType(JavaCompile) { 
      options.compilerArgs << "-AguiceAnnotationDatabasePackageName=com.android.app.sample" 
     } 
    } 
} 

Dodany następujących do AndroidManifest.xml:

<meta-data android:name="roboguice.annotations.packages" android:value="com.android.app.sample"/> 
+0

Powyższe wydaje się działać w przypadku projektów o smakach kompilacji. [RoboGuice wiki] (https://github.com/roboguice/roboguice/wiki/RoboBlender-wiki) jest nieaktualne. – Diederik

-3

Problem może zostać rozwiązany poprzez przepuszczanie w kontekście prawidłowo. Jeśli rozszerzasz klasę aplikacji, a następnie Inject a Context za pomocą roboguice, a następnie, gdy wstrzykujesz POJO, podaj w nich kontekst.

To zadziałało dla mnie.

- Shiv

Powiązane problemy