【发布时间】:2016-06-02 20:19:56
【问题描述】:
在我的应用程序中,我正在实现一种通过 DownloadManager 下载数据文件的机制。当用户开始下载时,它旁边会出现一个取消按钮,允许用户取消正在进行的下载。
这些数据文件会定期在服务器上更新,因此用户会不时想要再次下载相同的文件。文件名在更新期间保持稳定。
由于用户可以在下载过程中随时点击取消,我想保留旧版本,直到下载成功完成。为此,我重命名现有文件,然后才开始下载。如果用户取消下载(以及由于某种原因下载失败),我想将备份文件恢复到其原始位置。
对于取消的情况,我最初添加了以下代码,以便在单击取消按钮时运行:
if (downloadManager.remove(reference) > 0) {
if (destFile.exists())
destFile.delete();
backupFile.renameTo(destFile);
}
当我刷新文件时,旧文件会在下载开始之前被重命名。但是,我取消下载后,部分文件和备份都消失了。
由于我已经使用FileObserver 来监控下载进度,因此我将其扩展为还可以监控文件删除并生成日志消息。在 logcat 中,我看到同一文件的两个删除事件,这表明部分下载的文件被删除,备份被重命名,然后重命名的备份也被删除。
很公平,我想,显然 DownloadManager 在后台负责删除,所以我需要注意这一点。所以我修改了上面的事件处理程序,只将文件路径存储在一个列表中,而不做任何文件操作。然后我修改了我的FileObserver 以将所有已删除的文件与列表进行比较:如果匹配,则重命名备份文件。此外,我为每个操作添加了日志输出。
然而,事件的顺序实际上仍然是相同的:现在下载管理器删除了部分下载的文件,触发了我的FileObserver,这将反过来重命名备份文件。之后,备份文件被删除。
在我看来,下载管理器似乎过于热心:当下载被取消时,它会删除下载的文件,然后检查它是否真的消失了,如果它仍然在该路径中找到文件,则重试删除。
我怎样才能解决这个问题并防止下载管理器删除它没有下载的文件?
【问题讨论】:
标签: android android-download-manager