6

我正在构建一个应用程序,如果所有下载都已完成,它需要知道并发原因。只有在我所有的下载完成后才允许启动某个功能。

我设法编写了一个函数来检查队列中的旧下载:

DownloadManager dm = (DownloadManager) context.getSystemService(context.DOWNLOAD_SERVICE);

    Query q = new Query();
    q.setFilterByStatus(DownloadManager.STATUS_FAILED|DownloadManager.STATUS_PENDING|DownloadManager.STATUS_RUNNING);

    Cursor c = dm.query(q);

问题是——只是为了确定——在初始化时我想清理队列并删除所有条目。

有什么想法我现在可以删除条目吗?

这个功能对我不起作用,因为我不想物理删除文件......只是清空队列。

有任何想法吗?

4

2 回答 2

2

您可以等待 DownloadManager 仅完成您自己的下载吗?为此,您可以使用以下方式保存下载的句柄:

List<Long> downloadIds = new ArrayList<>();
downloadIds.add(downloadManager.enqueue(request));

然后你可以这样查询downloadManager:

    Query q = new Query();
    long[] ids = new long[downloadIds.size()];
    int i = 0;
    for (Long id: downloadIds) ids[i++] = id;
    q.setFilterById(ids);
    Cursor c = downloadManager.query(q);
    Set<Long> res = new HashSet<>();
    int columnStatus = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
    while (c.moveToNext()) {
        int status = c.getInt(columnStatus);
        if (status != DownloadManager.STATUS_FAILED && status != DownloadManager.STATUS_SUCCESSFUL) {
            // There is at least one download in progress
        }
    }
    c.close();

请记住,如果您只对自己的下载感兴趣,而不是对系统范围内可能发生的所有可能的下载感兴趣,这可能会起作用。

希望这可以帮助。

于 2014-09-22T13:10:36.817 回答
0

如果您不想物理删除文件,您可以在调用 DownloadManager 的删除功能之前备份它们。这不是一个优雅的解决方案,但我找不到任何其他方法

于 2013-11-02T19:18:31.460 回答