Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

在多任务下载时遇到一个问题 #383

Closed
xanaduo opened this issue Nov 3, 2016 · 5 comments
Closed

在多任务下载时遇到一个问题 #383

xanaduo opened this issue Nov 3, 2016 · 5 comments

Comments

@xanaduo
Copy link

xanaduo commented Nov 3, 2016

我使用这种方式启动下载。
final FileDownloadQueueSet queueSet = new FileDownloadQueueSet(downloadListener);
final List tasks = new ArrayList<>();
for (int i = 0; i < count; i++) {
tasks.add(FileDownloader.getImpl().create(Constant.URLS[i]).setTag(i + 1));
}
queueSet.downloadTogether(tasks);
但是我的任务并不是一起的加入的,而是根据点击一个个的添加的任务。同时呢有多个页面切换,但下载地址是不会变的,这个时候按理说任务是不变,界面只需要做刷新即可。但当暂停后再次使用queueSet.downloadTogether(tasks).start来启动任务,就会出现“FileDownloader.FileDownloader: Tasks with the listener can't start, because can't find any task with the provided listener”,意思是我没有提供监听。而监听呢是在最开始的时候已经设置了“new FileDownloadQueueSet(downloadListener);”并不需要再次设置吧?所以并不清楚正确的启动方式是怎样的?还是说遍历tasks,再去启动任务吗?

@xanaduo
Copy link
Author

xanaduo commented Nov 3, 2016

我调试后,发现tasks中的任务是有监听的,我不知道为什么queueSet.downloadTogether(tasks).start再次启动却提示这个。还是说FileDownloadQueueSet 不支持动态添加任务呢

@Jacksgong
Copy link
Collaborator

Jacksgong commented Nov 3, 2016

FileDownloader.FileDownloader: Tasks with the listener can't start, because can't find any task with the provided listener

这个Warning:

根据现有提示: 说明在全局队列中没有找到 绑定了对应Listener 的任务。
实际上: 还有可能是没有找到 未已附属(BaseDownloadTask#isAttached()) 并且 绑定了对应Listener 的任务 。


解决方法1

目前而言,如果你的tasks中的任务需要重新启动,请确保任务都已经停止了以后,调用BaseDownloadTask#reuse() 将该任务对象其复用后,再通过你前面的方式启动。

解决方法2

其实FileDownloadQueueSet中已经存储了所有任务公共的配置,因此你再缓存tasks,再reuse(复用该对象的任务配置),有些多余,因此可以考虑,重新创建任务,而不是缓存tasks(可以考虑缓存url`)。


未已附属(BaseDownloadTask#isAttached()) 存在的原因

这个是为了:准确的获取当前需要执行的任务。

why_attached

如上图,在t7的时候依然是使用listener1启动任务,此时就需要过滤出有哪些是使用listener1并且没有启动过的任务,因为就用户的使用场景,在t7启动任务,是希望启动(t4, t7]时间范围内的任务的。


根据该Issue情况,FileDownloader优化

  1. FileDownloadQueueSet中添加reuseAndStart接口,在开始之前,会尝试先将所有任务reuse了再启动。
  2. 完善那个警高的日志,将真正的含义表达出来。

@xanaduo
Copy link
Author

xanaduo commented Nov 3, 2016

public synchronized void start(final DownloadInfo downloadInfo)
{
new File(downloadInfo.resPath).mkdirs();
boolean existTask = false;
boolean reuse = false;
for (BaseDownloadTask task : downloadTasks)
{
if (task.getUrl().equals(downloadInfo.downloadImageUrl) ||
task.getUrl().equals(downloadInfo.downloadUrl))
{
int status = SingleDownloadManager.getImpl().getStatus(downloadInfo.did,
downloadInfo.downloadUrl);
if (status == FileDownloadStatus.paused || status == FileDownloadStatus.error ||
status == FileDownloadStatus.retry)
{
task.reuse();
reuse = true;
}
existTask = true;
break;
}
}
if (downloadTasks.size() == 0 || !existTask)
{
downloadTasks.add(
FileDownloader.getImpl().create(downloadInfo.downloadImageUrl).setPath(
downloadInfo.resPath, true).setTag(downloadInfo).addFinishListener(
new BaseDownloadTask.FinishListener()
{
@OverRide
public void over(BaseDownloadTask task)
{
new File(task.getPath() + task.getFilename()).renameTo(
new File(downloadInfo.imageSavePath));
}
}));
downloadTasks.add(FileDownloader.getImpl().create(downloadInfo.downloadUrl).setPath(
downloadInfo.resPath, true).setTag(downloadInfo));
queueSet = new FileDownloadQueueSet(fileDownloadListener);
queueSet.downloadSequentially(downloadTasks).start();
}
if (reuse)
{
queueSet.downloadSequentially(downloadTasks).start();
}
}
按照你这个方法1,我试了没反应。不知道我是不是用错了?

方法2的话,难道每次暂停啊、继续什么的,都需要重新生成Task吗,那这样也太不好了吧。
public synchronized void start(final DownloadInfo downloadInfo)
{
new File(downloadInfo.resPath).mkdirs();

    downloadTasks.add(FileDownloader.getImpl().create(downloadInfo.downloadImageUrl).setPath(
            downloadInfo.resPath, true).setTag(downloadInfo).addFinishListener(
            new BaseDownloadTask.FinishListener()
            {
                @Override
                public void over(BaseDownloadTask task)
                {
                    new File(task.getPath() + task.getFilename()).renameTo(
                            new File(downloadInfo.imageSavePath));
                }
            }));
    downloadTasks.add(FileDownloader.getImpl().create(downloadInfo.downloadUrl).setPath(
            downloadInfo.resPath, true).setTag(downloadInfo));
    queueSet = new FileDownloadQueueSet(fileDownloadListener);
    queueSet.downloadSequentially(downloadTasks).start();
}

@xanaduo
Copy link
Author

xanaduo commented Nov 3, 2016

而且我发现监听中的#completed方法走了多次,不过是概率性的问题,次数而且是不固定的。反正机率很大,特别是在不停的切换页面的时候很容易出现。

@Jacksgong Jacksgong added this to the 1.4.0 milestone Nov 9, 2016
@Jacksgong
Copy link
Collaborator

#completed走多次

内部代码逻辑这块是不允许的。

定位

你看看completed回调多次的task对象是否相同。

Jacksgong added a commit that referenced this issue Dec 4, 2016
Jacksgong added a commit that referenced this issue Dec 4, 2016
…ovided listener when the user try to start tasks with the listener

Closes #383
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants