Ich arbeite an einer ziemlich komplexen Android-Anwendung, die eine ziemlich große Datenmenge über die Anwendung benötigt (ich würde sagen, insgesamt etwa 500 KB - ist diese Größe für ein mobiles Gerät groß?). Soweit ich das beurteilen kann, führt jede Änderung der Ausrichtung in der Anwendung (genauer gesagt in der Aktivität) zu einer vollständigen Zerstörung und Wiederherstellung der Aktivität. Basierend auf meinen Erkenntnissen hat die Anwendungsklasse nicht den gleichen Lebenszyklus (dh sie wird in jeder Hinsicht immer instanziiert). Ist es sinnvoll, die Statusinformationen in der Anwendungsklasse zu speichern und dann aus der Aktivität heraus zu referenzieren, oder ist dies aufgrund von Speicherbeschränkungen auf Mobilgeräten im Allgemeinen nicht die "akzeptable" Methode? Ich freue mich über jeden Rat zu diesem Thema. Vielen Dank!
112
Antworten:
Ich denke nicht, dass 500 KB eine so große Sache sein werden.
Was Sie beschrieben haben, ist genau, wie ich mein Problem des Datenverlusts in einer Aktivität angegangen bin. Ich habe einen globalen Singleton in der Application-Klasse erstellt und konnte über die von mir verwendeten Aktivitäten darauf zugreifen.
Sie können Daten in einem globalen Singleton weitergeben, wenn sie häufig verwendet werden.
Rufen Sie es dann in einer beliebigen Aktivität auf:
Ich diskutiere es hier in meinem Blog-Beitrag unter der Rubrik "Global Singleton".
quelle
Diejenigen, die auf
Application
Instanz zählen, liegen falsch. Auf den ersten Blick mag es so aussehen, als ob dasApplication
existiert, solange der gesamte App-Prozess existiert, aber dies ist eine falsche Annahme.Das Betriebssystem kann Prozesse nach Bedarf beenden. Alle Prozesse sind in 5 im Dokument angegebene "Killability" -Ebenen unterteilt .
Wenn Ihre App beispielsweise in den Hintergrund tritt, weil der Benutzer auf einen eingehenden Anruf antwortet, kann das Betriebssystem je nach RAM-Status Ihren Prozess beenden (oder auch nicht) (wodurch die
Application
Instanz zerstört wird). .Ich denke, ein besserer Ansatz wäre es, Ihre Daten in einer internen Speicherdatei zu speichern und sie dann zu lesen, wenn Ihre Aktivität wieder aufgenommen wird.
AKTUALISIEREN:
Ich habe viele negative Rückmeldungen erhalten, daher ist es an der Zeit, eine Klarstellung hinzuzufügen. :) Nun, anfangs habe ich wirklich eine falsche Annahme verwendet, dass der Status für die App wirklich wichtig ist. Wenn Ihre App jedoch in Ordnung ist, dass manchmal der Status verloren geht (es können einige Bilder sein, die nur erneut gelesen / heruntergeladen werden), ist es völlig in Ordnung, sie als Mitglied von beizubehalten
Application
.quelle
Application
Instanz wieder her. Es gibt jedoch keine statischen Daten, auf die Sie zählen, es sei denn, Sie haben sie beibehalten.Wenn Sie außerhalb einer Aktivität auf den "globalen Singleton" zugreifen möchten und nicht
Context
alle beteiligten Objekte durchlaufen möchten, um den Singleton zu erhalten, können Sie einfach ein statisches Attribut in Ihrer Anwendungsklasse definieren, das den Verweis auf enthält selbst. Initialisieren Sie einfach das Attribut in deronCreate()
Methode.Beispielsweise:
Da Unterklassen von
Application
auch die Ressourcen erhalten können, können Sie einfach darauf zugreifen, wenn Sie eine statische Methode definieren, die sie zurückgibt, wie z.Seien Sie jedoch sehr vorsichtig, wenn Sie Kontextreferenzen weitergeben, um Speicherverluste zu vermeiden .
quelle
Application
. Sie können dazu in jeder Klasse eine statische Elementvariable deklarieren .Dave, um welche Art von Daten handelt es sich? Wenn es sich um allgemeine Daten handelt, die sich auf die gesamte Anwendung beziehen (Beispiel: Benutzerdaten), erweitern Sie die Anwendungsklasse und speichern Sie sie dort. Wenn sich die Daten auf die Aktivität beziehen, sollten Sie die Handler onSaveInstanceState und onRestoreInstanceState verwenden, um die Daten bei der Bildschirmdrehung beizubehalten.
quelle
Sie können die Orientierungsfunktion tatsächlich überschreiben, um sicherzustellen, dass Ihre Aktivität nicht zerstört und neu erstellt wird. Schau hier .
quelle
Sie können eine Anwendungsklasse erstellen und alle Daten auf diesem Calss speichern, um sie an einer beliebigen Stelle in Ihrer Anwendung zu verwenden.
quelle
Ich weiß, dass dies die sehr alte Frage ist, aber die Verwendung des ViewModel aus den Jetpack-Komponenten ist der beste Weg, um die Daten zwischen Aktivitätsrotation zu erhalten.
quelle