2012-12-18 27 views
6

Mam singleton GameStateManager, który chcę mieć do dyspozycji we wszystkich moich działaniach. W szczególności chcę, aby nasłuchiwał zdarzeń wypalonych z EventManager przy użyciu kontekstu aplikacji zamiast indywidualnego kontekstu aktywności.Aplikacja na Androida z RoboGuice 2.0 - Jak wstrzyknąć Singleton w kontekście aplikacji

GameStateManager oznaczona jest jednoelementowy adnotacji

próbowałem wstrzyknąć GameStateManager podczas Application.OnCreate (przepraszam, wpisane poniższy fragment z pamięci, a nie skopiowany i wklejony, więc mogą być niepoprawne)

public void OnCreate(){ 
    GameStateManager gameStateManager = RoboGuice.InjectMembers(this.getApplicationContext(), new GameStateManager()) 

} 

Myślałem, że instancja GameStateManager będzie skonstruowana z kontekstem aplikacji, a ponieważ jest opisana jako singleton, będzie dostępna później w kontekście aplikacji. Zauważyłem, że kiedy wstrzyknęłam GameStateManager w działanie, faktycznie dostałem nowy singleton związany z kontekstem aktywności. Tak więc w istocie mam 2 singletony :)

Jakieś pomysły na to, jak mieć prawdziwy singleton, który jest połączony z kontekstem aplikacji?

Dzięki!

Odpowiedz

0

Od RoboGuice jest zbudowany pod Guice można spróbować użyć @Singelton adnotacji który zagwarantuje jedną instancję za Injector

Spójrz na example application

+1

Próbowałem tego i nie zadziałało. Jeśli się nie mylę, to nie ContextSingleton da ci singleton na kontekst, co jest w rzeczywistości doświadczeniem, które widzę z Singletonem. – Erds

+0

Javadoc mówi, że powinno to być singelton dla kontekstu. Idę szukać więcej. Więc jak dotąd usuń tę odpowiedź. –

+0

nie krępuj się usunąć, nie mam tej opcji – Erds

1

Emisja obserwować mogą być spowodowane przez leniwej inicjalizacji (patrz https://code.google.com/p/google-guice/wiki/Scopes) w trybie programowania.

Jeśli najpierw wstrzykniesz swojego menedżera w działanie, zostanie ono w tym momencie utworzone leniwie. Ponieważ Activity spełnia dla każdego @Inject Context, działanie jest wstrzykiwane. Jest to bardzo szkodliwe, ponieważ jeśli Twój menedżer jest opatrzony komentarzem o numerze @Singleton, to żyje dłużej niż działanie i zasadniczo po prostu spowodował wyciek pamięci.

znalazłem to bardziej wyraźne na @InjectApplication lub Activity w zależności od tego, co spodziewałem się być wstrzykiwany gdzie (Activity zwykle @ContextSingleton 's, Application dla zwykłego @Singleton' s).