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

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?
 
Hast du dich schon mal mit dem Lifecycle von Activities auseinander gesetzt? 😛

Schau mal hier nach.

Gerade bei einer App wie deiner ist es wichtig den Lifecycle zu beachten um genau solche Dinge zu verhindern 🙂
 
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
 
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
 
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.
 
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


Zurück
Oben