In meiner App implementiere ich einen Mechanismus zum Herunterladen von Dateien über den DownloadManager. Wenn Benutzer einen Download starten, wird neben der Schaltfläche die Schaltfläche Abbrechen angezeigt, über die der Benutzer den Download abbrechen kann.Android DownloadManager, Backup-Dateien und abgebrochene Downloads
Diese Datendateien werden regelmäßig auf dem Server aktualisiert, sodass die Benutzer die gleiche Datei von Zeit zu Zeit erneut herunterladen möchten. Dateinamen bleiben bei Aktualisierungen stabil.
Da der Benutzer während des Downloads jederzeit auf Abbrechen klicken kann, möchte ich die alte Version beibehalten, bis der Download erfolgreich abgeschlossen wurde. Zu diesem Zweck benenne ich die vorhandene Datei um und starte erst dann den Download. Wenn der Benutzer den Download abbricht (auch wenn der Download aus irgendeinem Grund fehlschlägt), möchte ich die Backup-Datei an ihrem ursprünglichen Speicherort wiederherstellen.
Für den Fall, Abbrechen, habe ich ursprünglich den folgenden Code ausgeführt werden, wenn die Schaltfläche geklickt wird Abbrechen:
if (downloadManager.remove(reference) > 0) {
if (destFile.exists())
destFile.delete();
backupFile.renameTo(destFile);
}
Wenn ich eine Datei zu aktualisieren, die alte Datei, bevor der Download beginnt umbenannt wird. Nachdem ich den Download abgebrochen habe, sind sowohl die Teildatei als auch das Backup verschwunden.
Da ich bereits eine FileObserver
verwenden, um den Download-Fortschritt zu überwachen, habe ich es erweitert, um auch nach Dateilöschung zu sehen und eine Protokollmeldung zu generieren. Im Logcat sehe ich zwei Löschungsereignisse für dieselbe Datei, die anzeigt, dass die teilweise heruntergeladene Datei gelöscht wird, die Sicherung umbenannt wird und dann die umbenannte Sicherung gelöscht wird.
Fair genug, dachte ich, anscheinend kümmert sich DownloadManager um das Löschen im Hintergrund, also muss ich darauf achten, dass das passiert. Also habe ich den obigen Event-Handler modifiziert, um den Dateipfad nur in einer Liste zu speichern und noch keine Dateioperationen durchzuführen. Ich habe dann meine FileObserver
geändert, um alle gelöschten Dateien mit der Liste zu vergleichen: Wenn es übereinstimmt, benennen Sie die Sicherungsdatei um. Außerdem habe ich für jede Operation eine Protokollausgabe hinzugefügt.
Die Reihenfolge der Ereignisse ist jedoch immer noch die gleiche: jetzt wird die teilweise heruntergeladene Datei vom Download-Manager gelöscht, wodurch FileObserver
ausgelöst wird, was wiederum die Sicherungsdatei umbenennen wird. Danach wird die Backup-Datei gelöscht.
Es sieht so aus, als ob der Download-Manager übereifrig ist: Wenn ein Download abgebrochen wird, löscht er die heruntergeladene Datei, prüft dann, ob sie wirklich verschwunden ist und versucht den Löschvorgang erneut, wenn sie noch eine Datei in diesem Pfad findet.
Wie kann ich das umgehen und verhindern, dass der Download-Manager Dateien löscht, die er nicht heruntergeladen hat?