2016-02-18 4 views
3

Я пытаюсь использовать последнюю версию на сегодняшний день (3.0.1) из RoboGuice на своем новом Android-приложении, используя Android Studio 1.5 (стабильный).Является ли RoboGuice wiki устаревшим? setBaseApplicationInjector не существует?

Давным-давно, я имел дело с Guice & RoboGuice, но я взял некоторое чтение о том, как использовать Roboguice с новыми улучшениями &.

Дело в том, что я хочу использовать пользовательский модуль а для пользовательских привязок.

В моем конкретном случае у меня есть класс SoundManager, который предоставляет инструменты для воспроизведения нескольких звуковых дорожек по желанию с внутренним пулом MediaPlayer. Главный конструктор принимает applicationContext, который будет использоваться для создания нового MediaPlayer. Кроме того, этот класс должен быть синглтон:

  1. Если трек будет проигрываться на протяжении всего приложения, то SoundManager не может быть уничтожен/воссозданы;
  2. Один пул MediaPlayer достаточно, очень как ExecutorPool. Его следует использовать в случае необходимости для лучшего управления ресурсами.

Так что я сделал следующее:

  1. Создание интерфейса разоблачением поведение по умолчанию моей SoundManager: воспроизведение, остановка, резюме, выпустите и т.д ...;
  2. Внедрение этого интерфейса в полностью рабочем классе;
  3. Создание Module расширения com.google.inject.AbstractModule со следующим кодом:

@Override защищен недействительным Configure() { связывания (SoundManagerInterface.class) .то (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()

В моей с ase Я использовал getOrCreateBaseApplicationInjector(), потому что он был самым близким к setBaseApplicationInjector() и, наконец, продолжал тестировать мой код.

Suprise, это сработало! Мой SoundManager правильно создан, и applicationContext каким-то образом вводится (откуда я не знаю, но я надеюсь, что это не вызов Activity, иначе я сделан для утечки памяти ...) и звуковые дорожки действительно играют.

Но является ли экземпляр моего SoundManager того, что у одного синглета? Нет. Я попытался впрыснуть 3 из них и есть все объекты differents, пока показывает отладчик ...

Так что я делаю неправильно?

Эта ссылка: https://github.com/roboguice/roboguice/wiki/Advanced-Custom-Bindings#register-the-module-with-roboguice не может быть воспроизведена в моем коде:/

ответ

0

Правильный код установки согласно wiki:

public class MyApp extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     RoboGuice.getOrCreateBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(this), 
       new SoundManagerModule(), 
       ); 
    } 
} 

От вашего случая использования (сохранение на протяжении всей деятельности, старт/stop и т. д.), похоже, что вы хотите создать RoboService и ввести в него SoundManager. См. Документацию по адресу Services. Простое создание Singleton не позволит полностью избежать стандартных шаблонов архитектуры Android.

+0

спасибо за ваш ввод, но мне удалось использовать RoboGuice 3 без необходимости писать что-либо классом Application, и он работает. Не знаю, как, но это работает. – Mackovich