Android Memory Leak: Custom Adapter, Timer

Dieses Thema Android - Memory Leak: Custom Adapter, Timer im Forum "Mobile Geräte" wurde erstellt von bronsetin, 29. Dez. 2016.

Thema: Memory Leak: Custom Adapter, Timer Hallo zusammen, ich habe mir eine App zusammengebastelt, welche regelmäßig eine Datenbank abfrägt. Das funktioniert...

  1. Hallo zusammen,
    ich habe mir eine App zusammengebastelt, welche regelmäßig eine Datenbank abfrägt. Das funktioniert auch alles soweit, jedoch stürzt die App nach einiger Zeit ab, da der Speicher voll läuft.
    Auf meinem Handy sehe ich unter "Bereinigen des Speichers", dass immer mehr speicher reserviert wird.

    Vielleicht hat jemand von euch eine Idee woran es liegen könnt?
    Im Anhang mal der Code
     

    Anhänge:

  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Wie sieht denn deine onDestroy() Methode aus?
    "Löschst" du dort die bestehenden Requests auch ordnungsgemäß?
     
  4. Ich habe gar keine Methode onDestroy weder im CustomAdapter noch in der Aktivity...macht das nicht der garbage collector?

    Wo müsste ich die denn deiner Meinung nach einbauen CustomAdapter der Aktivity?
     
  5. Hast du dich schon mal mit dem Lifecycle von Activities auseinander gesetzt? :p

    Schau mal hier nach.

    Gerade bei einer App wie deiner ist es wichtig den Lifecycle zu beachten um genau solche Dinge zu verhindern :)
     
  6. Hallo,
    hast du richtig bemerkt, bin noch relativ neu in der Android Welt, danke für den Tipp

    public class MenueActivity extends AppCompatActivity {
    ...
    @Override
    protected void onDestroy(){
    //BezeichnungAbteilung = "";
    adapter.clearData();
    }

    In die Funktion onDestroy() in der MenueActivity wird leider nicht gesprungen, durch meinen Timer, nur wenn ich den Button drücke, was somit nicht mein Problem löst, denn bei jedesmal wenn der Timer auslöst, bekomme wird mehr speicher reserviert
     
  7. Ich würde dich einfach mal auf diese Seite weiter leiten.

    Dort ist relative schön erklärt, wie man mit Hilfe von Android Studio Tools (wenn du Android Studio benutzt) herausfinden kann an welcher Stelle genau (und welche Objecte) den Leak verursachen.

    Und noch mal kurz zum Garbage Collector: Das ist ein häufig gemachter Anfängerfehler, dass man denkt nicht mehr auf Speicherreservierung achten zu müssen. Wird auf der Seite auch unter dem Punkt: "What about the Garbage Collector" erklärt :)

    Gruß
    Robert
     
  8. Und was kann ich jetzt mit dem anfangen, das ist mir zu hoch im Moment, da steig ich nicht durch :(
     

    Anhänge:

  9. Also der Leak scheint definitiv vom Request zu kommen.

    Folgende Idee meiner Seits:

    Da du dein StringRequest als anonyme Klasse implementiert hast, herrscht eine implizite Referenz zu der äußeren Klasse. (deine Activity).
    Es kann also gut sein, dass daher der Leak kommt. Versuch deinen StringRequest mal in eine eigene Klasse auszulagern.

    Solltest du einen Denkanstoß brauchen schau bspw. mal hier nach.
     
  10. Hallo,
    das habe ich auch versucht, der Speicher steigt aber trotzdem.

    So rufe ich diesen auf:
    Map<String, String> parameters = new HashMap<String, String>();
    parameters.put("BEREICH", "10");
    parameters.put("ABTEILUNG", "0");

    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());

    CustomRequest jsObjRequest = new CustomRequest(com.android.volley.Request.Method.POST, showSQLTest, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
    try {
    if (response.contains("[]") != true) {
    System.gc();
    ...
     

    Anhänge:

  11. Da hast du den Listener ja immer noch als anonyme Klasse ;)
    Versuch den mal auch auszulagern.
     
  12. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!