Wenn statische Ressourcen getötet werden, sind sie alle getötet oder können einige in seltenen Randfällen bleiben?

Hinweis : Während die beiden bisherigen Antworten (am 6. September) interessant sind, gehen sie leider nicht auf die Frage.

Eines meiner Android-Test-Geräte ist ein HTC One X. Dieses Gerät ist bekannt für häufig Tötung von Hintergrund-Anwendungen (auch einschließlich der Launcher, die meisten ärgerlich), weil es dazu neigt, am Rand in Bezug auf RAM-Zuweisung leben, vermutlich aufgrund von HTC bloatware. Doch für meine Zwecke war dies äußerst nützlich, da es geholfen hat, die Auswirkungen von verschiedenen Situationen mit niedrigem Gedächtnis hervorzuheben und mir zu erlauben, meine Anwendung zu verbessern, um mit solchen Ereignissen fertig zu werden. Eines der Dinge, die ich gelernt habe, ist zum Beispiel, dass die Application und andere static Ressourcen getötet werden können, obwohl der Activity Backstack beibehalten wird. Also, um eine gute Benutzererfahrung zu geben, kann der Backstack bleiben, obwohl der einzelne Prozess, der die Anwendung läuft, und alle static s, die es hält, ist gegangen. Aus diesem Grund ist meine Bewerbung jetzt sehr robust in Bezug auf die ordnungsgemäße Überprüfung des Staates und die Durchführung der Neuinitialisierung, wenn nötig, der "Singleton" -Daten, die es bei der Wiederaufnahme einer Activity .

  • Einfachste Art, Picasso in Benachrichtigung zu verwenden (Symbol)
  • Wie kann man den On / Off-Status in onStop () überprüfen?
  • Kein ABI-Fehler beim Erstellen eines virtuellen Android-Geräts
  • Wie man einfaches Bild programmgesteuert erstellt?
  • ExoPlayer 2 Playlist Zuhörer
  • Das Scrollen einer Galerie ermöglicht den gedrückten Zustand und entfernt den Klicker aus Unterpositionen
  • Um auf meine spezifische Frage zu gehen, habe ich ein seltenes Symptom gesehen, dass ich durch Code-Inspektion nur von einem static Mitglied einer Klasse, die getötet wurde und dann nachträglich neu initialisiert wurde, verursacht wurde, während eine andere statische Ressource in einem Meiner Bibliotheksklassen wurde nicht neu initialisiert. Ich schätze, dass eine solche Abhängigkeit zwischen zwei getrennten static Ressourcen ein schlechtes Design von meinem Teil darstellt, und ich werde umgestalten, um dies zu vermeiden. Allerdings möchte ich wissen, ob ich in meiner Analyse richtig sein könnte – das heißt, es ist möglich, eine Stelle zu haben, in der der Backstack beibehalten wird, aber nur einige static Ressourcen werden getötet, vor allem auf einer Bibliothek / Paketbasis ?

    Bearbeiten 1 Ich gebe ein bisschen mehr Informationen über die beiden betroffenen Klassen.

    Klasse 1 ist eine Klasse, die wir Controller anrufen werden. Es ist nicht als Singleton verwendet, sondern enthält eine static Map von Daten, die in allen Instanzen gemeinsam sein sollen. Es ist so initialisiert:

     private static Map<String, String> sSomeMetaData; static { sSomeMetaData = new HashMap<String, String>(); } 

    Als nächstes habe ich eine Klasse namens MyFlyweightFactory . Diese Klasse lebt in einer separaten Bibliothek . Diese Klasse ist ein Singleton:

     private static MyFlyweightFactory instance = new MyFlyweightFactory(); public static synchronized MyFlyweightFactory getInstance(){ return instance; } private MyFlyweightFactory(){ } TreeMap<String, MyParserRenderer> images = new TreeMap<String, MyParserRenderer>(); 

    Jetzt ist hier die Abhängigkeit. Die Fabrikklasse hat eine Gettermethode, um ein bestimmtes Bildobjekt zu erhalten, das durch das Analysieren einer Datei aus dem Dateisystem erstellt wird. Wenn die Fabrik seit der Initialisierung nicht mehr für dieses Bild gefragt worden ist, analysiert sie es aus einer Datei (es handelt sich um eine SVG-Bildparser-Bibliothek von mir). Das Bild wird in ein MyParserRenderer Objekt MyParserRenderer . Wenn diese Bildanalyse sSomeMetaData , sSomeMetaData die Fabrik auch einige Daten im Controller Klasse ' sSomeMetaData . Alle Bilder, die die Fabrik hält, werden im TreeMap aufbewahrt. Also, diese Bilder sind ein nicht-statisches Mitglied einer static Singleton Fabrik Instanz.

    Die seltene Problemlage scheint zu sein, dass Instanzen von Controller feststellen, dass sSomeMetaData leer ist, obwohl ich weiß, dass MyFlyweightFactory einige Objekte aus seiner Map MyFlyweightFactory hat. Dies könnte sicherlich nur passieren, glaube ich, wenn die Intention von MyFlyweightFactory ist und deshalb nicht die Bildobjekte neu parsen musste (was bedeutet, dass es sSomeMetaData immer wieder bevölkert), sondern in der Zwischenzeit den static Initialisierer Des Controller ist seither wieder ausgeführt. Ich kann bestätigen, dass sSomeMetaData nicht clear() ed irgendwo anders in Code ist.

  • Was zu tun wann - java.io.FileNotFoundException: Kein Content-Anbieter?
  • Wie kann ich den InApp-Kaufstatus lokal speichern?
  • Android Glide: Wie kann ich Bitmaps herunterladen und zwischenspeichern?
  • Erkennung, ob ein BLE-Gerät auf Android verbindbar ist
  • Materialdialogbibliothek - verhindern, dass der Dialog auf onPositive Funktionsaufruf entlassen / geschlossen wird
  • Butter Messer - Injizieren auf Android lib
  • 2 Solutions collect form web for “Wenn statische Ressourcen getötet werden, sind sie alle getötet oder können einige in seltenen Randfällen bleiben?”

    Sie sollten sich das anschauen: Aktivitätslebenszyklus.

    Bildbeschreibung hier eingeben

    Wenn du nicht in Erinnerung bist, werden pausierte Aktivitäten getötet, um Speicher zu speichern.

    Deshalb, warum sollten Sie versuchen, dies in jeder Situation zu erklären, dass Sie die Aktivität neu erstellen müssen.

    Das ist keine ganze app, sondern auf einer aktivitätsbasis. So wird es anfangen, Aktivitäten zu töten, die es fühlt, dass es weniger wichtig ist. Einige Aktivitäten können betroffen sein, andere nicht, in der gleichen App.

    Beachten Sie die Spalte "Killable" in der obigen Tabelle – für jene Methoden, die als tödlich markiert sind, nachdem diese Methode den Prozess zurückgibt, der die Aktivität beeinträchtigt, kann das System jederzeit durchlaufen, ohne dass eine weitere Zeile seines Codes ausgeführt wird. Aus diesem Grund sollten Sie die onPause () – Methode verwenden, um persistente Daten (z. B. Benutzerbearbeitungen) in den Speicher zu schreiben. Darüber hinaus wird die Methode onSaveInstanceState (Bundle) aufgerufen, bevor die Aktivität in einen solchen Hintergrundzustand versetzt wird, so dass Sie jeden dynamischen Instanzzustand in Ihrer Aktivität in das gegebene Bundle speichern können, um später in onCreate (Bundle) zu empfangen, wenn die Aktivität Muss neu erstellt werden. Weitere Informationen darüber, wie der Lebenszyklus eines Prozesses an die Aktivitäten angehängt wird, die er hostet, finden Sie im Abschnitt "Prozesslebenszyklus". Beachten Sie, dass es wichtig ist, persistente Daten in onPause () anstelle von onSaveInstanceState (Bundle) zu speichern, da letzteres nicht Teil des Lebenszyklusrückrufs ist, also nicht in jeder Situation aufgerufen werden, wie in seiner Dokumentation beschrieben.

    Ich denke, du bist irgendwie auf dem falschen Track im Debugging oder die Verfolgung der Probleme in deiner Anwendung.

    Hier ist was ich dir sagen kann und was ich denke, dass du falsch verstanden hast

    Wenn Ihre Anwendung von Android zerstört wird, weil es Ressourcen braucht, wird Ihre Application auch "zerstört / gestoppt" und der backstack beibehalten. Wenn du deine Anwendung neu startet, wird deine spezifische Application "neu erstellt" ( onCreate() wird aufgerufen) und dein Activity Back Stack wird auch neu erstellt, was bedeutet, dass die letzte Activity , die sichtbar war Der Benutzer wird neu erstellt. Also im Grunde, was passiert in Ihrer Anwendung, ist das erwartete Verhalten. Warum einige Mitglieder in einer Bibliothek nicht neu initialisiert werden … ich kann es nicht herausfinden.

    Ich hatte auch eine ähnliche Frage hier: Anwendungsneustart – Activity Entry Point

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.