Activity Lifecycle

  • Guten Tag,


    ich habe ein wahrscheinlich relativ einfaches Problem:
    Ich initialisiere meine Activity in der onCreate Methode.
    Bisher war ich davon ausgegangen, wenn ich dann mit dem Pfeil zurück gehe und erneut die Activity starte, sie einfach resumed und onCreate wirklich nur einmal ausgeführt wird, allerdings ist dies nicht der Fall, stattdessen wird sie jedesmal wieder gestartet. Starten tue ich sie so:

    Java
    Intent i = new Intent(getApplicationContext(),
    								BatteryScreen.class);
    						i = i.putExtra("name", v.name);
    						i = i.putExtra("id", v.id);
    						i = i.putExtra("multi", m);
    						startActivity(i);


    Ist das verwerflich?
    Oder muss ich irgendwas bestimmtes in die onDestroy Methode reinschreiben, damit sie alles auf 0 (null) setzt?


    Das darausfolgende Problem ist eben, dass nach 6-7 zurück und starten, ich eine OutOfMemory Exception bekomme.

  • Du könntest statt eigener Activities lieber Fragments verwenden, das erleichtert Dir später auch die Anpassung auf's Tablet.
    Von irgend etwas auszugehen ist übrigens eine ganz schlechte Idee. ;)


    Nun, normalerweise sollte der GarbageCollector Deine Instanz wegräumen, wenn sie nicht mehr benötigt wird und es dürfte nie zu einem Speicherüberlauf kommen.
    Du schreibst allerdings, dass Du in der onCreate Deiner Activity eine weitere Activity erstellst.
    Nun kann ich nicht mit Bestimmtheit sagen, ob der Garbage Collector überhaupt eine Chance hat da irgendwas wegzuräumen.
    Eventuell könntest Du (wenn Du unbedingt den eingeschlagenen Weg weiter verfolgen willst) Deinen Intent in eine Instanzvariable auslagern und auf diese zugreifen.


    Da mir aber die Informationen fehlen, wann warum Du eine neue Activity aufrufst, kann ich hier nur raten. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • in der regel sollte das kein problem darstellen
    wenn du auf zurück klickst wird die auf dem stack oben liegende activity zerstört und alle attribute etc in der activity werden freigegeben.
    wenn du dann über die liste erneut den eintrag aufrufst sollte eine neue activity erzeugt werden und nicht nochmal ein und die selbe.


    was ich nicht ganz verstehe, wie kannst du im onCreate deiner main die zweite activity erstellen, wenn sie doch aufgerufen werden soll wenn du auf die liste klickst

  • Die onCreate Methode bezog sich auf die 2. Activity ;)
    Dann weiß ich ehrlich gesagt nicht, woran es liegen kann. Ich benutze in der 2. Activity 6 AndroidPlot graphen. Diese haben jeweils eine Werte Array von 240 Werten zu Grunde liegen. Bei einem Aufruf oder auf bei 5 macht das keinen Unterschied nur dann wird es allmählich langsamer, um schließlich am Ende mit einer OoM Exception nur noch leere Felder anzuzeigen.

  • dann versuch mal in der on destroy deine belegten objekte auf null zu setzen und schau ob das problem dann immernoch auftritt.
    Wenn danach alles funktioniert wird es wohl wie Marco schon sagte am Garbage Collector liegen.

  • Ah, Du benutzt dort Views aus einem Third-Party Framework.
    In dem Fall würde auch ich auf jeden Fall alles, was Du an Instanzvariablen (bzw. 'Membervariablen') in Deiner Activity hast, explizit auf NULL setzen.
    Ansonsten kann es durchaus sein, dass da noch irgendwelche Referenzen gehalten werden und die Garbage Collection nicht vernünftig aufräumen kann.


    Wenn die onDestroy() zuverlässig aufgerufen wird, solltest Du dort die Aufräumarbeiten durchführen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Dann habe ich noch eine blöde Frage:
    Wie setze ich denn die Views auf null?
    Also jeder Graph ist in der Klasse XYPlot gespeichert, welche von View erbt, aber auch direkt die Daten zum Anzeigen speichert. Hole ich mir dann einfach den XYPlot mit findViewByID und setze ihn dann auf null? Das erscheint mir irgendwie seltsam, weil ich doch dann im Prinzip nur die "Kopie" des Views auf null setze, oder? Oder läuft das über die Referenz?


    Danke schonmal, ich bin sehr optimistisch, dass es das ist ;)

  • Danach besteht das Problem leider immer noch...
    hier die volle Exception:



    ...und meine OnDestroy

  • du weißt in deinem on Destroy erst den variablen die views zu und löschst sie in der nächsten zeile wieder, HÄ?


    es ging darum das du in deiner klasse doch sicher eine globale variable hast wo du deine views drin verwaltest, dort musst du die werte auf null setzen.

Jetzt mitmachen!

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