- 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.
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 .. –
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