uni-app中plus.downloader.enumerate枚举出下载对象后无法使用addEventListener监听任务变化

发布于 1周前 作者 vueper 来自 Uni-App

uni-app中plus.downloader.enumerate枚举出下载对象后无法使用addEventListener监听任务变化

前提:使用 plus.downloader.createDownload 正常下载过程中用户退出app后此时下载中断,我用 plus.downloader.enumerate 来枚举下载未完成的任务对象来继续下载,使用 start() 或者 resume() 都可以实现继续下载的操作 但是此时的任务进度变化不能通过addEventListener 监听得到了,求解。

图片


1 回复

在uni-app中使用plus.downloader.enumerate枚举出下载对象后,确实不能直接对返回的每个下载任务对象使用addEventListener方法监听任务变化。这是因为enumerate方法返回的是一个包含下载任务信息的数组,而不是下载任务对象本身。每个任务信息中包含了任务ID(id),你需要使用这个ID来获取真正的下载任务对象,然后才能添加事件监听器。

以下是一个如何在uni-app中实现这一功能的代码示例:

// 获取下载管理器
const downloader = plus.downloader.createDownload(url, {}, header);

// 枚举当前所有的下载任务
plus.downloader.enumerate((downloads) => {
    downloads.forEach((downloadInfo) => {
        const taskId = downloadInfo.id; // 获取任务ID
        
        // 根据任务ID获取下载任务对象
        const task = plus.downloader.getDownloadById(taskId);
        if (task) {
            // 为下载任务添加事件监听器
            task.addEventListener('statechanged', (e) => {
                console.log('Download state changed:', e);
                switch (e.state) {
                    case 2: // STARTED 状态
                        console.log('Download started');
                        break;
                    case 3: // PROGRESSING 状态
                        console.log('Download progressing:', e.progress);
                        break;
                    case 4: // COMPLETED 状态
                        console.log('Download completed');
                        break;
                    case 5: // CANCELED 状态
                        console.log('Download canceled');
                        break;
                    case 6: // PAUSED 状态
                        console.log('Download paused');
                        break;
                    case 7: // FAILED 状态
                        console.log('Download failed:', e.error);
                        break;
                }
            });
        } else {
            console.error('Failed to get download task by ID:', taskId);
        }
    });
});

// 注意:这里的url, {}, header应该替换为实际的下载URL、请求方法和HTTP头信息

在这个示例中,我们首先通过plus.downloader.createDownload创建一个下载任务(这一步通常在实际开始下载之前进行,这里只是为了演示如何获取下载管理器)。然后,我们使用plus.downloader.enumerate枚举当前所有的下载任务。对于每个任务,我们通过其ID使用plus.downloader.getDownloadById方法获取实际的下载任务对象,并为其添加statechanged事件监听器。

请确保在实际使用中替换url, {}, 和header为具体的下载URL、请求方法和HTTP头信息。此外,这个示例假设你已经正确配置了uni-app项目以支持5+ App(即HTML5+扩展API)。

回到顶部