【问题标题】:RoboGuice: Using full reflection. Try using RoboGuice annotation processor for better performanceRoboGuice:使用全反射。尝试使用 RoboGuice 注释处理器以获得更好的性能
【发布时间】:2015-09-30 07:08:50
【问题描述】:

当我启动我的 RoboGuice android 应用程序时,日志中会出现以下消息:

roboguice.RoboGuice﹕使用全反射。尝试使用 RoboGuice 注释处理器以获得更好的性能。

什么意思?

我所有的活动(包括我的 MainActivity)都从 RoboGuice 类扩展而来。也许我遗漏了一些东西,并且有一种方法可以提高 RoboGuice 的性能,而我目前没有这样做。

注意:我使用的是 RoboBlender

【问题讨论】:

  • 你在用RoboBlender?
  • 是的,@tibo,我正在使用 Roboblender
  • 基于code,找不到你的注解数据库。
  • 我不得不在我的 MainActivity 上使用这个RoboGuice.setUseAnnotationDatabases(false);,因为没有这个 RoboGuice 就会崩溃。
  • 那就是问题所在...您可以更改问题的标题并发布崩溃日志。

标签: java android roboguice


【解决方案1】:

我建议你使用黄油刀。如果您使用 android studio 会更容易,它还有一个插件,只需单击一次即可生成自动视图注入:

有用的文档:https://github.com/avast/android-butterknife-zelezny

【讨论】:

  • 感谢您的建议,但我的整个应用程序都是使用 RogoGuice 完成的。我将在我的下一个应用程序中使用它
  • ButterKnife 与依赖注入无关。
【解决方案2】:

RoboGuice 基于 Google Guice 库,这是一个基于反射的依赖注入框架。不幸的是,Guice 在 Android 上表现不佳。例如,在我的最新项目中,初始化注入器需要 1 到 1.5 秒。

在某个时候,RoboGuice 开发人员决定通过在编译时做一些工作来提高他的库的性能,这就是 RoboBlender 的意义所在。它在编译时创建一个注释数据库,RoboGuice 在运行时使用它来搜索注入点。您可以阅读有关 RoboBlender here 的更多信息。这种方法需要对 Guice 进行大量更改,因此 RoboGuice 作者不得不分叉它,甚至向 Guice 发送了pull request。但是这个 PR 被拒绝了,主要是因为它与 Guice 库(作为一个运行时 DI 框架)的想法相矛盾。

很抱歉介绍这么长,这里是您问题的答案。当调用RoboGuice.setUseAnnotationDatabases(false) 时,您要求 RoboGuice 在运行时通过反射处理所有事情。换句话说,RoboGuice 的工作方式与原始 Guice 一样,而且速度不是很快。当您尝试使用注释数据库并且您的应用程序崩溃时,它可能会发生,因为无法找到注释数据库。也许您忘记在AndroidManifest.xml 中添加<meta-data android:name="roboguice.annotations.packages" android:value="..."/>

最后,我不建议您在 Android 上使用 Guice 或 RoboGuice,因为前者速度极慢,而后者在设计上被破坏了。使用 Dagger 这样的编译时 DI 库要好得多,切换到它应该不会花费很多时间。

【讨论】:

  • 嗨@Michael!非常感谢您的好评!现在一切都有意义了!我删除了RoboGuice.setUseAnnotationDatabases(false) 并没有出现异常,可能是我做错了什么。关于您的回复,您获得了赏金
【解决方案3】:

Roboguice 现在已移至版本 4.0.0。这在github 上可用,作为分支rg-4-final。在 gradle 中,您可以将其用作

compile 'org.roboguice:roboguice:4.0.0'
provided 'org.roboguice:roboblender:4.0.0'

我之前在让 Roboblender 工作时遇到过问题,但在 4.0.0 中它就像一个魅力。

虽然有一些变化。查看 Astroboy 示例以了解如何使用它。您不再扩展活动或片段,而是像这样在每个活动或片段中注入成员:

RoboGuice.getInjector(this).injectMembers(this);

他们放弃了@InjectView@InjectResource,您现在使用 Butterknife 来注入视图,以及您以正常 Android 方式获得的资源。不要忘记在您的应用程序中初始化 Roboguice:

RoboGuice.setupBaseApplicationInjector(this, new MyModule(), new OtherModule());

享受吧!

【讨论】:

  • 如果他们只是将站点文档更新到 4.0 :)
  • 我不知道他们为什么没有。
  • ` 没有绑定 android.content.Context 的实现。使用 roboguice 4.0 定位 android.content.Context` 时
  • 标准类的注入,如上下文,已从 Roboguice 中删除。你需要创建一个提供者来注入一个上下文。
猜你喜欢
  • 2012-04-18
  • 2013-11-21
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
相关资源
最近更新 更多