German Memory Dieb

Discussion in 'German Forum' started by hogiebaer, May 7, 2015.

  1. hogiebaer

    hogiebaer Active Member Licensed 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: May 7, 2015
  2. eurojam

    eurojam Well-Known Member Licensed 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):
    Code:
    '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)
    Code:
    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
     
  3. RauchG

    RauchG Active Member Licensed 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.

    http://www.b4x.com/android/forum/threads/app-wurde-beendet.49080/
     
  4. hogiebaer

    hogiebaer Active Member Licensed 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
     
  5. KMatle

    KMatle Expert Licensed 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 likes this.
  6. eurojam

    eurojam Well-Known Member Licensed 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:)
     
    KMatle likes this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice