Android Memory Leak: Custom Adapter, Timer

bronsetin

Mitglied
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

  • CustomAdapter.txt
    5,2 KB · Aufrufe: 3
  • MenueActivity.txt
    19,5 KB · Aufrufe: 4

Robat

Top Contributor
Wie sieht denn deine onDestroy() Methode aus?
"Löschst" du dort die bestehenden Requests auch ordnungsgemäß?
 

bronsetin

Mitglied
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?
 

Robat

Top Contributor
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 :)
 

bronsetin

Mitglied
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
 

Robat

Top Contributor
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
 

bronsetin

Mitglied
Und was kann ich jetzt mit dem anfangen, das ist mir zu hoch im Moment, da steig ich nicht durch :(
 

Anhänge

  • outfile_Leak_Suspects.zip
    101,2 KB · Aufrufe: 2

Robat

Top Contributor
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.
 

bronsetin

Mitglied
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

  • CustomRequest.txt
    3,1 KB · Aufrufe: 2

Neue Themen


Oben