- In Bezug auf das Anwendungsobjekt hier für weitere Informationen lesen:
Das Anwendungsobjekt ist der wichtigste absolute Ausgangspunkt für jede Android-App. Es wird immer existieren, bevor eines der Manifest Elemente wie Aktivität, Service und BroadcastReceiver deklariert. Also entspannen Sie sich, dass die Singletons für Sie da sind.
- In Bezug auf dem Singleton Paradigma:
, das ein großes Diskussionsthema ist, können Sie mehr über Google es so etwas auf es meine persönliche Meinung folgt. Was auch immer der Grund für Ihre Singletons ist (eine Datenbank, ein Bitmap-Caching, ein FileUtils) Ich denke, es ist in Ordnung und richtig, sie am allerersten Einstiegspunkt Ihrer App zu initialisieren, der Anwendung. Aber die Anwendung selbst ist nicht Gegenstand gemeint, diese Objekte zu tragen oder zu halten, auf diese Weise meine vorgeschlagene Designansatz ist:
=> auf der Singleton-Objekt/Klasse Sie müssen:
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);
}
=> und dann auf Ihrem Anwendungsobjekt init Sie einfach die Singleton
onCreate(){
MySingletonClass.init(getApplicationContext());
}
mit dieser Art und Weise Sie die notwendige Initialisierung halten werden, die Singletonmuster erzwingen, aber das Objekt, das Sie auf diese Objektklasse aufrufen zuzugreifen nicht auf die Anwendung . Ich weiß, es ist nur ein organisatorischer Unterschied, aber ich glaube, das ist der Unterschied zwischen gutem und schlechtem Code.
So zum Beispiel auf Ihrem Service ist der Anruf: MySingletonClass.get()
und sollte nie MyApplication.mySingle
sein.
hoffe es hilft.
Ja, ich habe jetzt einen Code wie diesen. Aber manchmal weiß ich nicht, warum mein Dienst NullPointerException auslöst, wenn ich versuche, Singleton-Feld hier zum Beispiel zu verwenden. –
deshalb schließe ich die 'throw new RuntimeException'-Zeile ein. Auf diese Weise können Sie sicher sein, dass es dadurch oder etwas anderes versagt. Eine andere Möglichkeit ist, absolut sicher zu sein, selbst wenn der GC es tötet, weil der Dienst Context hat, könnten Sie auf dem 'init()' einen Code 'if (instance == null)' setzen, um nur bei Bedarf initialisieren und init aufrufen vom Service auch. – Budius