2013-04-22 3 views
12

Ich entwickle eine Anwendung mit einer benutzerdefinierten Anwendungsklasse, die ein paar Singletons initialisiert, so dass sie während der gesamten Anwendungsarbeitszeit leben. Ich habe auch ein paar Dienste in meiner Anwendung, die mit diesen Singletons arbeiten. Ist es möglich, dass die Application-Klasse durch Android-Instanzen vor Diensten zerstört wird, so dass Dienste sie nicht nutzen können? Oder Anwendung lebt immer sogar für Dienste des Kontextes? Was ist der beste Weg, einen Ausweg aus dieser Situation zu finden?Lebensdauer der Anwendungsklasse bei laufendem Dienst

Danke.

Antwort

5
  • 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.

+0

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

+1

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

4

Von meinem Verständnis Service ohne Anwendung nicht leben kann context wird Service für die Anwendung mit der Referenz Context gebunden, damit ich, wenn die Anwendung auch denken und dass Blei getötet wird, um die Context getötet wird, dass alle Komponenten getötet worden,

Sie können

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

Verwandte Themen