Hallo
Zitat
bzw. würde das erst nach tausenden Schaltversuchen machen. Man sieht bei dieser kleinen Demo aber deutlich im Emulator/Profiler, das sie Speicher belegt und nicht freigibt.
Das ich kann so nicht Bestätigen. Ich habe auch mal so weine einfache App mit zwei Activity und Button gemacht und im Profiler den Ram verbrauch beobachtet. Am Anfang nach zwei drei Wechsel ging er leicht hoch pegelt sich aber ein, und von da ab wird Speicher verbraucht und wieder freigegeben. Klar das freigeben ist etwas verzögert. Ist aber normal.
Wenn das bei dir nicht so ist, stimmt irgendwas mit deinen Handy oder System nicht.
Es kann nicht sein das sich der Speicher bei so einer einfachen App ständig zu nimmt und nicht wieder freigegen wird.
Zitat
Ich komme eigentlich aus der C-Ecke und bin es da gewohnt, das man das, was man reserviert, auch selbst wieder freigibt. Und es wäre schön gewesen, wenns bei Android auch so eine Möglichkeit gegeben hätte.
Ist es ja auch in einem gewissen Rahmen. Du kannst es zwar nicht selber machen wie in C aber du kannst dem GC sagen das du das Objekt die Instanz nicht mehr brauchst und er es Freigeben kann.
Lösche einfach die Instanz wenn du sie nicht mehr brauchst.
„Null“ bei Java ist gleich wie bei C.
Wenn du also eine Variable auf null setzt wird sie vom GC erkannt und der reservierte Speicher wird freigegeben. Natürlich nicht gleich wie bei C, sondern wenn der GC Zeit hat oder wen der Speicher knapp wird sonnst tut er nichts.
Also wie ich schon sagte solltest du in der onDestry() Methode die ja beim beenden durchlaufen wird die wichtigsten Variablen wieder auf „null“ setzen damit der GC weiß das sie nicht mehr gebraucht werden.
Auch sagte ich dir das du nach dem "finish()" auch ein "System.exit()" machen sollst. Denn damit sollte der GS nach nicht benutzten Instanzen suchen und die Activity wirklich richtig beenden.
Das kannst du auch im Emulator beobachten. Das nach einem System.exit(0) die Activity komplett neu aufgebaut wird. Der Wechsel von der einen Activity zu anderen dauert dann etwas länger. Auch werden damit noch eventuell laufende Threads beendet.
finish();
System.exit(0);
// benutzen Speicher wieder freigeben beim Beenden.
List<String> farben;
protected void onCreate(Bundle savedInstanceState) {
....
farben = new ArrayList<String>();
farben.add("rot");
farben.add("blau");
}
protected void onDestroy() {
super.onDestroy();
farben=null;
}
Alles anzeigen
Zitat
Also werde ich wohl jetzt deinen Rat befolgen und mich in das Thema Fragmente einlesen, alles umschreiben um dann am Ende wieder festzustellen, das Fragmente leider keine Buttons unterstützen oder nur in chinesischer Sprache funktioniern..
Ob dir das hilft mag ich zu bezweifeln, wenn du deine Speicherverwaltung nicht in den Griff bekommst.
Und solche Sachen wie Button nur in Chinesisch zeigt mir das du immer noch an den Falschen stellen suchst.
Zitat
Ich dachte: Kein Problem, fängst du einfach das onBackPressed ab ..... Pustekuchen. Geht bei Activities nicht ( keine Ahnung, warum nicht ).
Stimmt auch nicht.
In eine Activity läst sich der OnBack Button abfangen. Wie hast du das den bis jetzt gemacht?
In eine Activity gibt es weiterhin die Methode „onBackPressed“
https://developer.android.com/…tivity.html#onBackPressed()
Das hat mit der AppBar nichts zu tun.
du willst doch die Hardware ( neu Software) Taste benutzen oder?
Besonders bei deinem Versuch mit dem LayoutSwitcher musst du extrem darauf aufpassen wo du dich gerade befindest, um auch richtig und sinnvoll zu Reagieren.
Damit meine ich , du musst immer wissen welches Layout gerade activ ist und welche IDs (Button,Texte …) gerade im Layout vorhanden (geladen) sind. Notfalls musst du auch ständig immer wieder das findviewbyId machen, und prüfen ob eventuell Nullpointer entstanden sind. Das ist meiner Meinung sehr aufwendig und Fehler trächtig.
Diesen Vorschlag wird dir bestimmt kein erfahrener Programmierer geben.
Zu der Frage viel RAM das Handy hat. Gab es keine Antwort. Ich finde das schon etwas wichtig. Denn die maximale Standart Heap Größe ist vom verbauten RAM abhängig. 1 GB RAM ca 128 MB Heap
Bei 2gb schon 256 MB Heap als Standart.
Und wenn die erreicht ist sollte der GC spätestens aktiv werden.
Und jenachdem was du machst also wofür du Speicher verbrauchst. Ist das etwas entscheidet. Bei vielen großen Bildern zb. Grossen Speicher intensiven Listen....
Welche Meldung bekommst du denn überhaupt wenn das Handy hängt?
Wäre auch nicht schlecht zu wissen.
Benutzt du etwa auch thread die nicht richtig beendet werden. Denn wenn du keine Meldung über Out of Memory bekommst. Scheint mir das mehr in diese Richtung zu gehen.
Zitat
Das liegt aber nicht direkt am Editor, denn das Gleiche passiert auch mit einer einfachen Einstellungs-Activity mit ein paar Edit Feldern und Buttons
Wenn dem wirklich so ist würde mich diese activty mal interessieren