我刚刚将项目升级为使用Roboguice 3,突然间所有注入的对象都变为空,包括POJO,提供者,视图,资源等等。我正在努力弄清楚原因。
首先是gradle构建文件,打开和关闭Proguard并且没有任何区别。我相信我们目前正在使用Roboguice 3.0.1,但我尝试了3.0并仍然遇到了问题。
compile ('org.roboguice:roboguice:3.+') {
exclude module: 'asm'
}
provided 'org.roboguice:roboblender:3.+
我们在模块文件中有一些自定义绑定,所以这是我如何根据wiki指定它:
<meta-data
android:name="roboguice.modules"
android:value="com.some.CustomModule"/>
仅仅为了记录,我也尝试在这样的Application类中指定它并且它不起作用:
RoboGuice.getOrCreateBaseApplicationInjector(
this,
RoboGuice.DEFAULT_STAGE,
RoboGuice.newDefaultRoboModule(this),
new CustomModule(this));
关于它的设置,我们没有改变任何东西,如果我使用Roboguice 2,一切正常。
我还尝试了其他一些事情:
RoboGuice.setUseAnnotationDatabases(false);
的情况下也尝试了它没有什么区别。Ln.d("Test" + Strings.toString(0));
这个日志打印得很好,所以我认为实际的库是正确打包的。RoboGuice.getInjector(this).getInstance(SharedPreferencesHelper.class);
这样的手动注入,它抛出了关于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.
的错误。奇怪的是,在SharedPreferencesHelper类中我们有一个公共构造函数注释@Inject
,我想不知何故它没有被考虑?也许整个问题是由于没有考虑注释?我现在已经开始反对它几天了,非常感谢任何输入或更多的东西尝试。
答案 0 :(得分:4)
将此添加到应用程序类将解决当前问题。如果添加到默认启动活动,它也应该有效。
static {
RoboGuice.setUseAnnotationDatabases(false);
}
AnnotationDatabaseImpl类由Roboblender在编译时生成。
获取注释数据库:
编译器参数&#34; guiceAnnotationDatabasePackageName&#34;决定生成的AnnoationsDatabaseImpl类分配给哪个包。
对于maven版本:
<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>
然后在应用程序清单中,在application元素内添加一个引用生成的类的元数据标记。
<meta-data android:name="roboguice.annotations.packages" android:value="some.package.name.here"/>
如果您进行了这些更改并使用了intellij,则重新导入Maven pom将应用这些更改。或者,在Intellij中,您可以指定编译器参数以获取要创建的注释。
这将在Settings / Build,Executions,Deployment / Java Compiler
中的附加命令行参数下进行<强> -AguiceAnnotationDatabasePackageName = some.package.name.here 强>
希望这会有所帮助并为您节省一些悲伤:)
答案 1 :(得分:3)
使用gradle和Android Studio
时出现同样的错误我在build.gradle文件中添加了以下内容:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-AguiceAnnotationDatabasePackageName=com.android.app.sample"
}
}
}
在AndroidManifest.xml中添加了以下内容:
<meta-data android:name="roboguice.annotations.packages" android:value="com.android.app.sample"/>
答案 2 :(得分:-3)
可以通过正确传递上下文来解决问题。如果要扩展应用程序类,然后使用roboguice注入上下文,然后在注入POJO时,则在其中传递上下文。
这对我有用。
- 希夫