German Memory Dieb

hogiebaer

Active Member
Licensed User
Longtime User
Hi Fans,

seit Wochen quält mich ein riesiges Problem. Meine App stürzt sporadisch ab mit der Meldung
"[Appname] wurde beendet. Heute bin ich dahinter gekommen, warum es passiert.

Habe mir mal einen Timer eingebaut auf 4 sekunden, wo mir über toastmessageshow der
verfügbare speicher angezeigt wird.

Beim Erststart zeigt er mir 49500 an. Jetzt beende ich die App und starte sie neu.
Jetzt stehen plötzlich nur noch 38200 als verfügbarer Speicher zur Verfügung.
Also App wieder beendet und neu gestartet mit dem Ergebnis 26900.
Das geht bis kein Start mehr möglich ist, bzw die App abschmiert.

Daher meine Frage:
Wieso schmeisst Android die App nicht komplett aus dem Speicher beim beenden??
Habe in der Activity_Pause (userclosed=true section) mehrere Kombis ausprobiert, unter anderem natürlich auch
gestartetete Services zu stoppen und auch mal in der letzten Zeile in dieser Section
den Befehl Activity.RemoveAllViews und auch Activity.Finish

Alles hat nichts geholfen, der Speicher wird nicht freigegeben. Was läuft hier falsch ????


PS: Habe gerade festgestellt, dass ich eine lib benutze, in der auch canvas benutzt wird.
Auch kommuniziert diese über callsubdelayed3 mit der mainactivity. Liegt hier eventuell das
Problem ? Wenn ja, wie gebe ich die verwendeten canvas referenzen wieder frei ?


Nachtrag : Habe das Problem nun sehr unkonventionell gelöst. Einfach als letzten Befehl ExitApplication eintragen, dann schmeisst er alles raus. Denke aber, dass es trotzdem
unsauber ist, aber es geht.



Thx
Holger
 
Last edited:

eurojam

Well-Known Member
Licensed User
Longtime User
Hallo Holger,
hatte gerade auch mit einer App ziemliche Speicherprobleme, besonders auf Samsung Tablets. Ich habe nun die Activities, die eine Canvas verwenden mit folgender Routine entmüllt (habe ich hier im Forum entdeckt):
B4X:
'Recyclen des ganzen Mülls
Dim Obj1 As Reflector
Obj1.Target = canvas1
Obj1.Target = Obj1.GetField("bw")
Obj1.Target = Obj1.RunMethod("getObject")
Obj1.RunMethod("recycle")

und zusätzlich habe ich noch im Manifest folgendes eingetragen (siehe http://stackoverflow.com/questions/11275650/how-to-increase-heap-size-of-an-android-application)
B4X:
SetApplicationAttribute(android:largeHeap,"true")
obwohl die Experten hier im Forum, dass nur als letztes Mittel der Wahl anraten...

seit dem läuft es stabil (habe allerdings noch das laden von Bitmaps auf den Start reduziert und halte die benötigten Bitmaps in einer Map ständig vor....)

Viele Grüße
Stefan
 

RauchG

Active Member
Licensed User
Longtime User
Habe das gleiche Problem. Oder besser: hatte das Problem, bevor ich die App jetzt mit "ExitApplication" beende.

Die User sollen umfangreiche Erfassungen vornehmen. Die Erfassungen wiederholen sich immer wieder mit anderer ID. Unkontrolliert stürzte die App, nach längerer Benutzung, an den verschiedensten Stellen ab.

Jetzt beende ich die App nach jeder Erfassung mit "ExitApplication". Die User müssen jetzt die App zwar jedes mal neu starten, aber sie stürtzt nicht mehr ab.

Hier ist noch ein Tipp von Klaus.

https://www.b4x.com/android/forum/threads/app-wurde-beendet.49080/
 

hogiebaer

Active Member
Licensed User
Longtime User
@eurojam
Das mit dem Heap nach oben prügeln kannte ich, bin aber wie Erel der Meinung, dass es das Problem nur verschiebt und nicht wirklich löst. Da die App ja auch
mit dem Standard Heap auskommt, wollte ich das Problem natürlich auch richtig lösen. Mit dem Codesnip von dir werd ich mal testen, aber Gott sei Dank funtzt ExitApplication :)

Thx an Euch

Gruss
Holger
 

KMatle

Expert
Licensed User
Longtime User
Ja, generell sollte man behutsam mit Views umgehen und diese nicht immer neu anlegen. Ich hatte ähnliche Probleme und programmiere mittlerweile so, dass ich die Views (Beispiel: Dateneingabe) nur 1x anlege und danach nur noch enable/disable (o.ä.) und nur die Inhalte überschreibe.

Generell baue ich mir für den "finalen" Test immer einen Timer in die App, der die Hauptfunktionen mal 1-2h aufruft. Gelegentlich schaue ich dann beim Fernsehen mal auf das Tablet/Telefon, ob die App immer noch läuft. Geht natürlich nicht immer so einfach, aber so bekommt man schnell eine Prüfung hin, ob die App keinen Speicher "frisst". Nach 5000 Aufrufen einer Funktion sollte man hier sicher sein.
 

eurojam

Well-Known Member
Licensed User
Longtime User
das ist mal eine Super Idee mit dem Timer! Bayern verliert 0:3 und die App ist danach stabil, das werde ich demnächst auch so machen:)
 
Top