我在Android Studio中直接使用RoboGuice 3.0,因为我需要ActionBarActivity支持。这是我的代表:
compile 'org.roboguice:roboguice:3.0'
我要做的第一件事就是解决“无法使用注释数据库”的ClassNotFoundException。看起来如果没有给出注释包,packageList是prepended with empty string,并且DI框架抱怨它无法在根包中找到AnnotationDatabaseImpl(这是预期的)。所以我在清单中做到了这一点:
<meta-data android:name="roboguice.annotations.packages" android:value="roboguice"/>
解决了这个问题。然后,我将代码更改为:
@ContentView(R.layout.activity_playlists)
public class Playlists extends RoboActionBarActivity {
@InjectView(R.id.toolbar)
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setSupportActionBar(toolbar);
}
}
setSupportActionBar()抛出一个NPE。我逐步调试了调试器 注入视图时,viewMembersInjectors映射为空。我在想我必须做的奇怪修复,这是相关的。不知怎的,没有发现injectview成员。但是我的@ContentView注入工作(如果我删除了内容,则永远不会调用更改的回调)。
有谁知道如何解决这个问题?
答案 0 :(得分:4)
一个解决方案是使用扩展Application.class的自定义类,可以禁用注释数据库的使用。
public class CustomApplication extends Application {
public void onCreate() {
super.onCreate();
RoboGuice.setUseAnnotationDatabases(false);
}
}
另一种方法是创建一个名为roboguice.useAnnotationDatabases
的Enviroment变量,其值设置为false,因为RG3似乎检查了该值。
这将允许您像以前一样使用RoboGuice,但它会因使用注释数据库的使用而失去所有性能提升。
<强>更新强>
生成注释数据库还应修复NPE,并为您的应用程序增加一些性能提升。首先,您必须在build.gradle
中包含以下依赖项。
depencencies {
...
provided 'org.roboguice:roboblender:3.0'
}
您还应添加以下内容:
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-AguiceAnnotationDatabasePackageName=databasename"
}
}
}
要使数据库正常运行,您应该在AndroidManifest.xml
的元数据值中添加databasename。
<meta-data android:name="roboguice.annotations.packages" android:value="roboguice,databasename"/>