2013-04-22 10 views
12

Pracuję nad aplikacją z niestandardową klasą Application, która inicjalizuje kilka singletonów, dzięki czemu mogą one żyć podczas całego czasu pracy aplikacji. Mam również kilka usług w mojej aplikacji, które działają z tymi singletons. Czy jest możliwe, że klasa Application zostanie zniszczona przez androida instancjami singlet-ów przed usługami, więc usługi nie będą mogły z nich korzystać? Lub życie aplikacji zawsze, nawet dla usług z tego kontekstu? Jaki jest najlepszy sposób na znalezienie wyjścia z tej sytuacji?Cykl życia klasy aplikacji podczas działania usługi

Dzięki.

Odpowiedz

5
  • w odniesieniu do przedmiotu zgłoszenia:

Obiekt aplikacji jest głównym absolutnym punktem początkowym w dowolnej aplikacji na Androida. Zawsze będzie istnieć przed każdym z zadeklarowanych przez Manifest przedmiotów, takich jak Activity, Service i BroadcastReceiver. Więc zrelaksuj się, aby singlony były tam dla ciebie.

  • Odnośnie Paradigma jednoelementowy:

To wielki temat dyskusji, można google więcej o nim, więc co za tym idzie jest moja osobista opinia na jej temat. Bez względu na to, jaka jest przyczyna twoich singletonów (baza danych, buforowanie bitmap, FileUtils), myślę, że wszystko jest w porządku i prawidłowe, aby je zainicjować w pierwszym punkcie wejścia do twojej aplikacji, czyli aplikacji. Ale sama aplikacja nie jest obiektem przeznaczona do przenoszenia lub posiadanie tych przedmiotów, w ten sposób mój Proponowane podejście projektowe jest:

=> na singleton obiektu/klasy musisz:

private static MySingletonClass instance; // reference to the single object 
private MySingletonClass(Context c){ // private constructor to avoid construction from anywhere else 
    // let's say it needs the context for construction because it's a database singleton 
} 
public static MySingletonClass get(){ // 
    if(instance == null) throw new RuntimeException("This singleton must be initialised before anything else"); 
    return instance; 
} 
public static void init(Context c){ // call the initialisation from the Application 
    instance = new MySingletonClass(c); 
} 

=> a następnie na obiekt Application po prostu init Singleton

onCreate(){ 
    MySingletonClass.init(getApplicationContext()); 
} 

z tej drodze będziesz utrzymania niezbędnej inicjalizacji, egzekwować Singleton ale aby uzyskać dostęp do obiektu nawiązywać połączenia do tej klasy obiekt nie do zastosowania . Wiem, że to tylko różnica organizacyjna, ale wierzę, że to jest to, co odróżnia dobry i zły kod.

Na przykład w usłudze połączenie to: MySingletonClass.get() i nigdy nie powinno być MyApplication.mySingle.

nadzieję, że to pomaga.

+0

Tak, teraz mam taki kod. Ale czasami nie wiem, dlaczego moja usługa rzuca wyjątek NullPointerException, gdy próbuję użyć pola singleton tutaj na przykład .. –

+1

dlatego dołączam linię 'throw new RuntimeException'. W ten sposób możesz być pewien, że to z tego powodu zawodzi lub coś innego. Innym sposobem jest absolutna pewność, nawet jeśli GC go zabije, ponieważ usługa ma Kontekst, możesz na 'init()' umieścić kod 'if (instance == null)', aby tylko zainicjować w razie potrzeby i wywołać init od usługi też. – Budius

4

Z mojego serwisu zrozumienie nie może żyć bez stosowania context, serwis jest zobowiązany do stosowania z odniesieniem Context więc myślę, że jeśli wniosek zostanie zabity również Context zostaje zabity i że prowadzenie że wszystkie składniki zostały zabite,

można przeczytać tutaj, aby uzyskać więcej informacji

http://developer.android.com/guide/components/fundamentals.html#proclife

Powiązane problemy