Ich denke, in meinem Android-Live-Hintergrund gibt es ein Memory-Leck. Immer wenn ich den Bildschirm drehe, erhöht sich die Menge an gesammeltem Speicherabfall um 50 KB und geht nicht wieder zurück. Ich denke, das könnte durch eine geplante Zukunft verursacht werden, also werde ich ein Szenario präsentieren, um zu sehen, ob das der Fall ist.
Angenommen, Sie haben eine Klasse (nennen wir sie Foo), die die folgenden Elemente hat.
private ScheduledFuture future;
private final ScheduledExecutorService scheduler = Executors
.newSingleThreadScheduledExecutor();
private final Runnable runnable = new Runnable() {
public void run() {
// Do stuff
}
};
Und jetzt setzen Sie eine geplante Zukunft
future = scheduler.scheduleAtFixedRate(runnable, Verzögerung, Geschwindigkeit,
ZeitEinheiten.MILLISECONDS);
Die Zukunft hält eine Referenz auf das ausführbare Objekt, und das ausführbare Objekt hält eine Referenz auf das übergeordnete Foo-Objekt. Ich bin mir nicht sicher, ob das der Fall ist, aber könnte diese Tatsache bedeuten, dass, wenn nichts im Programm eine Referenz auf Foo hält, der Garbage-Collector es immer noch nicht sammeln kann, weil es eine geplante Zukunft gibt? Ich bin nicht besonders gut im Multithreading, also weiß ich nicht, ob der von mir gezeigte Code bedeutet, dass die geplante Aufgabe länger leben wird als das Objekt, was bedeutet, dass es nicht als Müll gesammelt wird.
Wenn dieses Szenario nicht dazu führt, dass Foo nicht vom Garbage Collector gesammelt wird, muss mir das nur mit einer einfachen Erklärung gesagt werden. Wenn es verhindert, dass Foo gesammelt wird, wie kann ich das beheben? Muss ich Zukunft.cancel(true); Zukunft = null;
machen? Ist der Teil Zukunft = null
unnötig?