Android DownloadManager remove() - 如何确定remove()操作何时完成?

时间:2014-10-09 02:07:30

标签: android android-download-manager download-manager

是否有一种简单的机制来确定DownloadManager remove()何时完成,因为它似乎是部分异步的。该函数几乎立即返回,其中删除了下载表中的条目计数,但实际的文件系统管理似乎被推送到某个后台线程中。

问题是我已经编写了一些代码,用于查找和删除文件X的任何现有DownloadManager条目(希望文件系统对象),然后再提取新副本。不幸的是,在文件系统管理工作开始之前,新副本正在进入目录,用于之前的版本。所以管家实际上最终会在某个时候删除新版本并在DownloadManager表中留下一个孤儿条目。

可以通过某种方式阻止文件系统删除操作。

调试代码:

    DownloadManager.Query query = new DownloadManager.Query().setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL);
    downloads = getAllDownloadIds(manager.query(query));

    path = activity.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);

    //If a file name was passed remove any existing entry / version of the file
    if ( fileName != null && ! fileName.isEmpty() ){
        if ( downloads.containsKey(fileName)){
            ids = downloads.get(fileName);
            for (Long id : ids) {
                Uri path = manager.getUriForDownloadedFile(id);
                File checkFile = new File(path.toString());
                Log.e(TAG, "Removing existing file: " + path.toString() + ":" + id);
                int entriesRemoved = manager.remove(id);
                Log.e(TAG, "Existing files removed: " + entriesRemoved);                  
            }
        }
    }


...
Log.v(TAG, "Attempting to create a file in the 'Download' directory on the external storage::" + path.toString() +"/"+ fileName);
file = new File(path, fileName);
Log.v(TAG, "Does the file already exist::" + file.exists());

示例输出:

… V/Export﹕ Removing existing file: file:///storage/sdcard/Download/appData.csv:101
… V/Export﹕ Existing files removed: 1
… V/Export﹕ Attempting to create a file in the 'Download' directory on the external storage::/storage/sdcard/Download/appData.csv
… V/Export﹕ Does the file already exist::true

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题 - 在快速网络中替换小文件时,替换文件有时会在调用DownloadManager.remove(...)后的几分之一秒内到达。在这种情况下,新到达的文件将被删除。 / p>

我使用的解决方案是,在我致电DownloadManager.remove(...)之前,我设置了FileObserver来监控文件。然后我调用remove(...),然后在启动替换下载之前等待DELETE事件触发。

这结束了在多个类之间分配的大量代码。还有其他复杂因素 - 例如我放置了一个超时机制以防万一DownloadManager永远不会删除该文件。 (我无法想象为什么它不会,但它不是我的组成部分。)

所以回答问题"是否有一个简单的机制.....":有一些机制可供你使用,但遗憾的是不是特别容易的机制。

答案 1 :(得分:0)

我解决这个时间问题的方法就是在DownloadManager.remove函数之前删除文件。 "删除"将删除对下载的引用。无论如何都要发挥作用。

int idFromCursor = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_ID));
String localPathOfFile =cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
File fileToDelete= new File(localPathOfFile);

if(fileToDelete.exists()){
   fileToDelete.delete();
}
downloadManager.remove(idFromCursor);
之后再没有时间问题了。