Frage

Ich bin auf eine ziemlich komplexe Android-Anwendung arbeiten, die eine etwas große Menge an Daten über die Anwendung erfordert (ich würde sagen, dass insgesamt etwa 500 KB - das ist groß für ein mobiles Gerät?). Von dem, was ich sagen kann, in der Anwendung jede Orientierungsänderung bewirkt (in der Tätigkeit, um genauer zu sein), um eine vollständige Zerstörung und die Erholung der Aktivität. Basierend auf meinen Erkenntnissen ist die Anwendungsklasse nicht den gleichen Lebenszyklus hat (das heißt, es ist für alle Absichten und Zwecke, instanziiert immer). Ist es sinnvoll zu speichern, die Zustandsinformation innerhalb der Anwendungsklasse zu machen und es dann von der Aktivitätsreferenz, oder ist das im Allgemeinen nicht die „acceptable“ Verfahren aufgrund von Speicherbeschränkungen auf mobile Geräten? Ich schätze irgendwelche Ratschläge zu diesem Thema. Dank!

War es hilfreich?

Lösung

Ich glaube nicht, dass 500kb große Sache sein wird.

Was Sie beschrieben ist genau, wie ich mein Problem zu verlieren Daten in einer Aktivität in Angriff genommen. Ich habe eine globale Singleton in der Anwendungsklasse und konnte sie für den Zugriff auf von den Tätigkeiten, die ich verwenden.

Sie können die Daten übergeben um in einer globalen Singleton, wenn es viel werden wird verwendet.

public class YourApplication extends Application 
{     
     public SomeDataClass data = new SomeDataClass();
}

es dann rufen Sie an einer Tätigkeit durch:

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

ich diskutieren hier in meinem Blog-Post unter dem Abschnitt "globale Singleton."

Andere Tipps

Diejenigen, die auf Application Instanz zählen sind falsch. Zunächst mag es scheinen, als ob die Application existiert so lange, wie die gesamte App-Prozess vorhanden ist, aber das ist eine falsche Annahme.

Das Betriebssystem kann Prozesse wie nötig töten. Alle Prozesse werden in 5 Stufen von „killability“ geteilt im doc angegebenen .

So, zum Beispiel, wenn Ihre Anwendung durch den Benutzer Beantwortung auf einen eingehenden Anruf im Hintergrund geht, dann je nach dem Zustand des RAM kann das Betriebssystem (oder auch nicht) tötet Ihren Prozess (die Application Instanz zerstören im Prozess).

Ich denke, eine bessere Annäherung an Ihre Daten bestehen auf interne Speicherdatei und dann lesen, wenn Ihre Tätigkeit wieder aufnimmt.

UPDATE:

Ich habe viele negative Bewertungen, so ist es Zeit, eine Klarstellung hinzuzufügen. :) Nun, zunächst wirklich ich eine falsche Annahme verwendet, dass der Staat für die App wirklich wichtig ist. Allerdings, wenn Ihre Anwendung OK ist, dass manchmal der Staat verloren geht (es könnte ein paar Bilder, die nur reread / redownloaded sein werden), dann ist es völlig OK, um es als Mitglied der Application zu halten.

Wenn Sie die „Global Singleton“ außerhalb einer Aktivität zugreifen wollen, und Sie wollen nicht den Context durch alle beteiligten Objekte zu übergeben Sie die Singleton zu erhalten, können Sie einfach ein statisches Attribut in Ihrer Anwendungsklasse definieren, die hält die Referenz auf sich selbst. Nur initialisieren das Attribut in der onCreate() Methode.

Zum Beispiel:

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

Da Subklassen von Application kann auch die Ressourcen erhalten, man kann sich nur zugreifen, wenn Sie eine statische Methode definieren, die sie zurückgibt, wie:

public static Resources getAppResources()
{
    return _appCtrl.getResources();
}

Aber sehr vorsichtig sein, beim Passieren um Context Verweise auf vermeiden Speicherlecks .

Dave, welche Art von Daten ist es? Wenn es allgemeine Daten ist, dass bezieht sich auf die Anwendung als Ganzes (Beispiel: Benutzerdaten), dann die Application-Klasse erweitern und dort speichern. Wenn die Daten bezieht sich auf die Aktivität, sollten Sie die onSaveInstanceState und onRestoreInstanceState Handler verwenden, um die Daten auf dem Bildschirm Rotation zu anhalten.

Sie können tatsächlich die Orientierung Funktionalität außer Kraft setzen, um sicherzustellen, dass Ihre Aktivität nicht zerstört und neu erstellt wird. Schauen Sie href="https://stackoverflow.com/questions/456211/activity-restart-on-rotation-android">.

Sie können Application-Klasse erstellen und speichern Sie Ihre alle Daten auf, die Anrufe für uns als irgendwo in Ihrer Anwendung.

scroll top