解决FileDownloader库中无全部开始下载任务接口的问题

Posted 独立开发者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决FileDownloader库中无全部开始下载任务接口的问题相关的知识,希望对你有一定的参考价值。

FileDownloader这个下载库提供了暂停全部下载任务的接口,没有提供全部开始下载的接口,下面我给说一下我项目中的解决方式。

FileDownloader:https://github.com/lingochamp/FileDownloader

先看一下我的下载界面:

瞬间感觉有点标题党了。。。
首先,下载任务的列表展示所需的数据,我是自己单独存储的一个数据库,数据库中存储了FileDownloader返回的downloadId以及下载资源的信息;下载进度和下载状态等信息使用downloadId调用FileDownloader的接口查询。

FileDownloader的基本使用方式我就不在此介绍,我只说关于此博客的部分。

正在下载的资源列表是从自己存储的数据库查询出来的,当收到FileDownloader下载完成的通知后,会同步修改数据库中该资源的下载完成状态。

博客地址:http://blog.csdn.net/qxs965266509

以下内容都是在下载列表进行阐述的:

在Adapter 中onBindViewHolder方法需要每次替换下载任务的监听器,同时我也把该监听器存储到全局的Map中,如下:

FileDownloader.getImpl().replaceListener(downloadVideoInfoModel.getDownloadId(), fileDownloadListener);
this.fileDownloadListenerMap.put(downloadVideoInfoModel.getUrl(), fileDownloadListener);

点击正在下载的任务,根据下载Id暂停一个任务:

FileDownloader.getImpl().pause(downloadVideoInfoModel.getDownloadId());

点击暂停的任务,开始或继续下载一个任务:

//url:下载链接    
//path:自定义的下载路径(可不设置)   
//fileDownloadListener  下载监听
int downloadId = FileDownloader.getImpl()
                .create(url)
                .setPath(path)
                .setAutoRetryTimes(3)//可省略
                .setCallbackProgressTimes(100)//可省略
                .setListener(fileDownloadListener)
                .start();

如果是在下载列表中调用start,建议传递fileDownloadListener,因为这个任务可能是新任务或重新下载的任务;如果当前任务不是新创建的下载任务,那么start返回的downloadId也需要更新到自己存储的数据库中,因为可能会有变化。

点击下方全部暂停,全部暂停下载任务:

FileDownloader.getImpl().pauseAll();

全部开始下载任务:
可能你也想到下面的方法,就是遍历所有任务start,但是有一个问题,就是设置监听器的问题,不然列表上无法显示下载状态和进度。

1、获取RecycleView列表中第一个和最后一个显示条目的位置

LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recycle_view.getLayoutManager();
                int firstPosition = linearLayoutManager.findFirstVisibleItemPosition();
                int lastPosition = linearLayoutManager.findLastVisibleItemPosition();

2、遍历所有的任务,任务处理屏幕显示的,从Map中获取监听器,重新start,其他不显示的任务直接start即可。

public void notify(int firstPosition, int lastPosition) 
        if (this.downloadVideoInfoModelList != null && this.downloadVideoInfoModelList.size() > 0) 
            DownloadVideoInfoModel downloadVideoInfoModel;
            for (int i = 0; i < this.downloadVideoInfoModelList.size(); i++) 
                downloadVideoInfoModel = this.downloadVideoInfoModelList.get(i);
                if (firstPosition <= i && i <= lastPosition) 
                    FileDownloadListener fileDownloadListener = fileDownloadListenerMap.get(downloadVideoInfoModel.getUrl());
                    DownloadManager.getInstance()
                            .updateDownload(downloadVideoInfoModel.getUrl(), downloadVideoInfoModel, fileDownloadListener);
                 else 
                    DownloadManager.getInstance()
                            .updateDownload(downloadVideoInfoModel.getUrl(), downloadVideoInfoModel, null);
                
            
        
    

DownloadManager.getInstance()
.updateDownload这个方法的内容就是上面开始任务的调用方式:

int downloadId = FileDownloader.getImpl()
                .create(url)
                .setPath(path)
                .setAutoRetryTimes(3)//可省略
                .setCallbackProgressTimes(100)//可省略
                .setListener(fileDownloadListener)
                .start();

此文章主要就是给大家一个解决思路,并没有完美的解决问题,希望对你有所帮助。

有问题,直接@我(965266509)

以上是关于解决FileDownloader库中无全部开始下载任务接口的问题的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程下载器FileDownloader(支持断点续传代理等功能)

windows 2003添加删除windows组件中无iis应用程序服务器项的解决

windows 2003添加删除windows组件中无iis应用程序服务器项的解决方法

win2003添加删除windows组件中无iis应用程序服务器项的解决方法

FileDownloader - 依赖于浏览器的不同行为

文件下载工具类