欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-06 17:21:32
...

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

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

先看一下我的下载界面:
解决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)