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

  • 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);
    }
  • 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.

  • 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 ?

  • 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.

  • 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!