2014-09-15 13 views
5

Dies ist eine Follow-up-Frage zu einem meiner previous questions.Wie lange leben Klassen mit statischen Methoden in Android?

Ich habe eine LoadingActivity, die einige Grafiken lädt, die von allen Aktivitäten benötigt werden, und speichert sie in einer statischen Klasse. Ich versuche, die LoadingActivity nicht erneut zu laden, wenn ich HOME drücke und die App wieder aktiviere, da sie sehr viel Speicher verbraucht und nach mehreren Malen wieder ausläuft, wodurch die Grafik bereits geladen ist, so dass LoadingActivity nicht mehr gestartet werden muss. Meine Frage ist, wie lange lebt die statische Klasse? Kann ich nach der Wiederaufnahme der App auf die Verfügbarkeit vertrauen, oder kann es es hier sein, da Android es aufgrund von Speicherproblemen tötet oder ist es immer hier so lange wie die VM läuft (das heißt, solange das Telefon läuft)?

+0

Ich glaube, sie bestehen so lange, wie Ihr Bewerbungsprozess am Leben bleibt. Aber Objektreferenzen als Static zu halten, ist in der Anwendungsentwicklung, in der der Speicher des Geräts eingeschränkt ist, keine gute Idee. – waqaslam

+2

Statische Klassen sind an den Lebenszyklus der Anwendung selbst gebunden, die nach dem Willen von Android AFAIK ist. NIEMALS verlassen Sie sich auf statische Klassen. Zeitraum. – Machinarius

+0

Mit "statische Klasse" meinst du Verweise auf "statische Objekte"? Vielleicht möchten Sie das klären ... Es klingt, als würden Sie nach Klassen fragen, die mit 'static class' deklariert sind. –

Antwort

6

Wie Simon herausstellt, bedeutet "statische Klasse" verschiedene Dinge in verschiedenen Sprachen, und Java hat nichts wie die statischen Klassen in einigen anderen Sprachen. Aber ich denke nicht, dass du darüber redest. Sie scheinen zu fragen, ob Objekte, auf die durch starke statische Referenzen verwiesen wird, als Garbage Collected zu betrachten sind. Wenn ja, ist die Antwort nein. Eine Klasse wird durch ein Objekt der Klasse Class repräsentiert, das über seine ClassLoader erreichbar ist. Alles, auf das durch die Class verwiesen wird, wird daher erreichbar sein, solange die ClassLoader erreichbar ist, was im Falle des System-Klassenladeprogramms so lang ist, wie die Java/Dalvik-VM existiert. Aber das ist nicht solange das Telefon läuft, da eine unabhängige VM für jede App erstellt wird. Der gesamte Prozess und die VM, in der eine App ausgeführt wird, werden möglicherweise beendet, wenn sich die App im Hintergrund befindet. Wenn Sie zur App zurückkehren, werden die Klassen neu geladen.

Wenn statische Felder sind wirklich die beste Wahl, im Gegensatz zu einem ContentProvider oder foregound Service, dann jedes Mal die App wieder müssen Sie überprüfen, ob die statischen Referenzen initialisiert wurden und neu initialisieren, ob sie null sind.

+0

Das ist einfach falsch. Es gibt keine statische Klasse, es sei denn, Sie beziehen sich auf eine statische innere Klasse innerhalb eines Objekts. Sprechen Sie über POJOs oder Aktivitäten mit statischen Referenzen? Oder statisch initialisierte Klassenfelder? Da Java keine statischen Klassen hat, stimme ich die Antwort bis zur Klärung ab. – Simon

+0

geklärt. **** –

+0

Theoretisch könnten ein bestimmter ClassLoader und alle von ihm geladenen Klassen von der VM entladen werden. Android-Apps werden mit einem benutzerdefinierten Ladeprogramm geladen, nicht mit dem Ladeprogramm "system". In der Praxis entlädt Dalvik keine Klassen, also ist es ein strittiger Punkt. – fadden