解决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)

猜你喜欢

转载自blog.csdn.net/qxs965266509/article/details/78776259
今日推荐