Statische Variablen bei App restart schon gesetzt ??

  • Hey folks,

    ich habe in meiner App eine Klasse "Variables" in der sehr viele statische Variablen und Methoden sind, auf die ich von vielen anderen Klassen zugreifen muss.

    kleiner Auszug daraus...


    Viele Variablen werden an dieser Stelle einfach mit "null" oder "" initialisiert, und im Laufe des Programms erhalten sie dann ihre üblichen Werte.

    Nun stehe ich vor folgendem Problem, ich starte meine App und sie funktioniert reibungslos. Beende ich meine App mittels onBackPressed() oder mittels finish() ist zwar die Activity destroyed aber die App selbst (und leider so wie es aussieht auch meine Klasse "Variables") dümpelt im Hintergrundnoch irgendwo im OS rum.
    Starte ich nun die App erneut, so verhält sie sich fehlerhaft da einige Variablen in der Klasse "Variables" vom vorherigen "laufen lassen" noch gesetzt sind.
    Wie kann ich nun sichergehen das meine App komplett mit allem drum und dran geschlossen wird, ohne das ich auf meinem Gerät den "Taskmanager" (keine ahnung wie die Funktion bei Android heisst) starte und die App aus der Liste der kicke.

    LG proto

    Ich benutze:
    Android Studio 1.0.1
    Build: AI-135.1641136

  • Habe code Schnipsel gefunden, die den gewünschten Effekt bewirken, aber ist das auch sauber und elegant gelöst?

    Java
    @Override
      public void onBackPressed() {
            super.onBackPressed();
    
    
            int pid = android.os.Process.myPid();
            android.os.Process.killProcess(pid);
    }

    Ich benutze:
    Android Studio 1.0.1
    Build: AI-135.1641136

  • Ein tipp von mir, benutze so wenig static wie möglich. Wenn du eine solche konstanten klasse hast mach sie bitte static final.
    Es ist sehr ungesund von überall variablen lesen und schreiben zu können. Mit final sorgst du zumindest dafür das sie nicht mehr geschrieben werden können.

  • Also ich sehe keine Nachteile wenn ich von überall auf eine static Variable zugreifen kann. Solange ich mich selbst nicht "verhasple" in der Benutzung einer solchen Variable, wobei die Metapher "über seine eigenen Füße stolpern" passend ist. Erst laufen lernen und dann rennen... :thumbup:

    Ich habe eben oft das Problem das ich von einer Activity zur anderen sehr viel Infos auf dem einfachsten weg übergeben möchte. Diese Infos möchte ich aber vielleicht auch später noch verwenden/verändern/wiederverwenden und auch vielleicht an ganz anderen Stellen im Programm. Die einfachste Möglichkeit die mir dafür einfällt ist so eine Klasse mit statischen Variablen.

    Ich benutze:
    Android Studio 1.0.1
    Build: AI-135.1641136

  • Eigentlich spricht nichts gegen die Verwendung einer solchen Klasse wie du sie gepostet hast. In kleineren Projekten verwende ich ähnliche Systematik. In größeren kommt dann jedoch eher so etwas wie Apache Tamaya o.ä. zum Einsatz. (Java Projekte, nicht speziell Android) Alternativ kannst du als Workaround eine Klasse bauen, die dem Singleton Pattern folgt und nicht static ist. Vielleicht wird das Objekt dann nach Beendigung der App vom GC destroyed.

  • Um auf Daten zuzugreifen, auf die ich aus mehreren Activities zugreifen möchte gehe ich normalerweise folgendermaßen vor:

    - Ich erstelle eine Klasse die von "Application" erbt und die alle benötigten Variablen als private deklariert. Um darauf zuzugreifen benutze ich dann die jeweiligen öffentlichen getter und setter Methoden.

    Code
    public class ApplicationData extends Application {
         ...
    }


    - In Activity XY kann ich jetzt über ein Object der Klasse ApplicationData auf alles zugreifen.


    Halte ich für sauberer als die Nutzung von static variablen und die Gefahr sich zu verhaspeln ist wesentlich geringer.

  • Wie greifst du denn dann von verschiedenen Activities auf das selbe ApplicationData Objekt zu ? Dann müsstest du doch eigentlich dieses Objekt an die jeweilige Activity übergeben, wie z.B. einen Behälter zum Daten ablegen.

    Ein Beispiel:

    du erstellst ein ApplicationData Objekt "app" in Activity 1, mit den Werten x=2, y=5.
    nun startest du Activity 2 (die natürlich in einer eigenen .java Datei definiert ist).
    wie kommst du im lifecycle von Activity 2 nun an "app" von Activity 1 ?

    Ich benutze:
    Android Studio 1.0.1
    Build: AI-135.1641136

  • Die ApplicationData Klasse funktioniert im Prinzip auch nur wie ein Singleton, also so wie whitenexx es auch schon vorgeschlagen hatte.


    Code
    app = (ApplicationData) getApplication();

    sorgt dafür, dass sich alle "app", oder wie du es nennen möchtest auf das gleiche, einzige ApplicationData Object beziehen.
    Es sind also alle Daten die du da reinschreibst während der Laufzeit aus jeder anderen Activity verfügbar.

  • Ich habe eben in einem Java Projekt (nicht Android) auf TypeSafes Configuration API umgebaut und kann es empfehlen. Funktioniert super und unterstützt alle gängigen Configuration Systeme (Javas hauseigene, HOCON, JVM Arguments + System Arguments). Wer noch legacy Support für Java 7 benötigt, kann die alte 1.2.1 Version verwenden, ansonsten ist Java 8 Pflicht.
    https://github.com/typesafehub/config

  • ah jetzt kapier ichs... Eines muss ich aber noch anmerken und zwar, finde ich es positiv das der Zugriff auf die Variablen bei der von mir oben geposteteten Klasse wesentlich kürzer ist.

    Ich benutze:
    Android Studio 1.0.1
    Build: AI-135.1641136

  • Dann musst du aber auch damit leben, dass die Variablen Werte manchmal rumspinnen ;) die Application Klasse kümmert sich für dich um den gesamten LifeCycle und verhindert damit genau das von die beschriebene Problem.

  • Nutz einfach keine statischen variablen zum schreiben, das gibt nur probleme, glaub uns einfach mal.

    Die Singleton Variante ist die gängiste, für Android angepasst wurde das ja schon erklärt. Was ich da aber noch machen würde wäre ein Interface schreiben über das du auf die daten der Application Klasse zugreifst. Denn nicht jede methode dieser klasse möchtest du überall öffentlich anbieten (so verringerst du auch die möglichkeit dich zu verhaspeln).

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!