RoboGuice 维基过时了吗?setBaseApplicationInjector 不存在



我正在尝试使用Android Studio 1.5(稳定版)在新的Android应用程序上使用迄今为止的最新版本(3.0.1)的RoboGuice

很久以前,我处理过Guice和RoboGuice,但我开始阅读一些关于如何使用Roboguice的新改进和功能。

这里的重点是我想为自定义绑定使用自定义模块

在我的特定情况下,我有一个SoundManager类,它提供了使用内部MediaPlayer池随意播放多个音轨的工具。主构造函数采用将用于创建新MediaPlayer applicationContext。此外,这个类应该是一个单例:

  1. 如果要在整个应用程序中播放曲目,则无法销毁/重新创建SoundManager;
  2. 一池MediaPlayer就足够了,就像ExecutorPool一样.必要时应重新使用,以便更好地管理资源。

所以我做了以下工作:

  1. 创建一个界面来公开我SoundManager的默认行为:播放、停止、恢复、释放等......
  2. ;
  3. 在完全工作类中实现此接口;
  4. 使用以下代码创建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架构模式。

相关内容

  • 没有找到相关文章

最新更新