2012-12-18 25 views
6

Tüm etkinliklerim için kullanmak istediğim bir GameStateManager singleton'um var. Özellikle, bireysel bir Etkinlik Bağlamı yerine Uygulama Bağlamı'nı kullanarak EventManager ile çıkan Olayları dinlemesini istiyorum.RoboGuice 2.0 ile Android uygulaması - Uygulama içeriğiyle birlikte bir Singleton nasıl enjekte edilir

GameStateManager ben Application.OnCreate sırasında GameStateManager enjekte etmeye çalıştı

tekil ek açıklama ile işaretlenir (üzgün, kopyalanıp yapıştırılan değil bellek, aşağıda pasajı yazmış, bu yüzden yanlış olabilir)

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

} 

GameStateManager örneğinin uygulama bağlamıyla oluşturulacağını ve tek birton olarak açıklandığı için uygulama bağlamında daha sonra kullanılabileceğini düşündüm. Fark ettiğim şey, GameStateManager'ı bir etkinliğe enjekte ettiğimde, gerçekte etkinlik bağlamına bağlı yeni bir tekil var. Yani özünde 2 tane bekar var :)

Uygulama içeriğine bağlı gerçek bir 'singleton' a nasıl sahip olacağınıza dair bir fikir var mı?

Teşekkürler! RoboGuice Guicealtında inşa edilmiştir

cevap

0

beri Injector

example application

+1

Bunu denedim ve işe yaramadı. Eğer yanılmıyorsam, ContextSingleton size bağlam başına bir tekil vermez, bu aslında Singleton ile de gördüğüm deneyimdir. – Erds

+0

javadoc, bağlam için singelton olması gerektiğini söylüyor. Daha fazla aramak için gidiyor. O zaman bu cevabı şu ana kadar silmemize izin verin. –

+0

silmek için çekinmeyin, bu seçeneği kullanmıyorum – Erds

1

gözlemlemek sorunu için bir göz atın başına tembel başlatma neden olabilir bir örneği garanti @Singelton ek açıklama kullanmayı deneyebilirsiniz Geliştirme modunda (bkz. https://code.google.com/p/google-guice/wiki/Scopes).

Yöneticinizi öncelikle bir etkinlikte enjekte ederseniz, bu noktada tembel bir şekilde oluşturulur. Activity, @Inject Context için tatmin olduğundan, etkinlik enjekte edilir. Bu aslında çok zararlıdır, çünkü yöneticiniz @Singleton ile açıklamalıysa, etkinlikten daha uzun yaşar ve temelde bir bellek sızıntısı yaratmış olursunuz.

ben nerede ( Activity genellikle @ContextSingleton için 's, düz @Singleton için Application' s) enjekte edilmesi bekleniyor şeye bağlı olarak @Inject Application veya Activity için daha açık buldum.