我正在尝试使用Android Studio 1.5(稳定版)在新的Android应用程序上使用迄今为止的最新版本(3.0.1)的RoboGuice
。
很久以前,我处理过Guice和RoboGuice,但我开始阅读一些关于如何使用Roboguice的新改进和功能。
这里的重点是我想为自定义绑定使用自定义模块。
在我的特定情况下,我有一个SoundManager
类,它提供了使用内部MediaPlayer
池随意播放多个音轨的工具。主构造函数采用将用于创建新MediaPlayer
applicationContext
。此外,这个类应该是一个单例:
- 如果要在整个应用程序中播放曲目,则无法销毁/重新创建
SoundManager
; - 一池
MediaPlayer
就足够了,就像ExecutorPool
一样.必要时应重新使用,以便更好地管理资源。
所以我做了以下工作:
- 创建一个界面来公开我
SoundManager
的默认行为:播放、停止、恢复、释放等......
; - 在完全工作类中实现此接口;
- 使用以下代码创建
Module
扩展com.google.inject.AbstractModule
:
@Override 受保护的 void configure() { bind(SoundManagerInterface.class).to(SoundManager.class).asEagerSingleton(); }
现在这个SO帖子的重点:
RoboGuice.setBaseApplicationInjector()
去哪儿了??我阅读的所有带有模块示例的文章,最近的一篇早在 2014 年,都公开了相同的方法:创建一个扩展android.app.Application
的应用程序类,并在 onCreate()
方法中使用 RoboGuice.setBaseApplicationInjector()
。但它不存在!我唯一可用的方法是:
-
RoboGuice.getOrCreateBaseApplicationInjector()
-
RoboGuice.destroyInjector()
-
RoboGuice.newDefaultRoboModule()
-
RoboGuice.overrideApplicationInjector()
-
RoboGuice.setUseAnnotationDatabases()
-
RoboGuice.injectMembers()
就我而言,我使用了getOrCreateBaseApplicationInjector()
,因为它似乎最接近setBaseApplicationInjector()
,最后继续测试我的代码。
令人惊讶的是,它奏效了!我的SoundManager
被正确创建,并且以某种方式注入了applicationContext(从哪里开始,我不知道,但我希望这不是调用Activity
否则我就完成了泄漏内存......)并且确实播放了音轨。
但是我的SoundManager
实例是单身人士的例子吗?不,不是。我尝试注入其中的 3 个,并且调试器显示的所有对象都不同......
那我做错了什么?
此链接:https://github.com/roboguice/roboguice/wiki/Advanced-Custom-Bindings#register-the-module-with-roboguice 无法在我的代码中复制:/
正确的设置代码是根据维基:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(this),
new SoundManagerModule(),
);
}
}
从您的用例(整个活动的持久性,启动/停止等)来看,听起来您想创建一个RoboService
并将SoundManager
注入其中。请参阅有关服务的文档。仅仅创建一个Singleton
并不能让你完全避免标准的Android架构模式。