阅读 222

Android 多任务文件断点下载和上传(高仿VIVO应用市场)直接拿去用

笔者是面霸,面试200+场       当过考官:面过别人300+场     去过500强,也呆过初创公司。

关注我就能达到大师级水平,这话我终于敢说了, 年薪60万不是梦!

斩获腾讯、华为、字节跳动,蚂蚁金服,oppo,VIVO,安卓岗offer!我有一套速通大厂技巧分享给你!

最近在做云备份功能。包含上传和下载。网上的下载框架写点太复杂了,太老了。又不好用,自己封装了一套。支持上传和下载功能!

3个类搞定。并且实现架构功能,通过泛型封装!完全解耦,直接可以拿去用,特别简单

编写流程:

1.任务管理器DownLoadManager

2.下载器DownLoadTask()

3.和网络交互:DownLoadEngine() 维护状态的关键



一、什么是多任务下载框架

多任务框架就是指,同一时间内,支持多个资源下载。支持下载队列、进度更新、下载取消暂停等。

包括:网络下载请求,下载任务执行、下载任务调度、UI进度更新、任务状态变化、文件的存储。

*支持多任务下载

*支持多线程断点下载

*支持进度更新|暂停|取消|恢复

*支持在任意界面监听下载进度

*支持后台下载,notification更新

*网络切换智能判断

*下载队列优先级

二:实现的点

断点续传 range    206   软件:HttpRequester    先请求文件大小,是否支持断点下载     拼接的时候不要错了,多了或者少了,看看字节数

观察者模式:进度

线程池:Executor

队列:Queue     LinkBlockQueue




/**

* Description: 下载管理

*

* @Author:* Date: 2021/4/27 16:13

**/

public class DownLoadManagerextends BaseTransferManager {

private static final StringTAG ="DownLoadManager";

    private static volatile DownLoadManagerinstance;

    private DownLoadManager() {

}

//下载任务

    private LinkedBlockingDequeloadTasks =new LinkedBlockingDeque<>();

    public LinkedBlockingDequegetAllTasks() {

return loadTasks;

    }

/***

    * 添加批量任务

    */

    public void addTaskList(List transferItemModels) {

if (transferItemModels !=null && !transferItemModels.isEmpty()) {

for (TransferItemModel transferItemModel : transferItemModels) {

addTaskModel(transferItemModel);

            }

}

}

private void addTaskModel(TransferItemModel transferItemModel) {

addTask(new DownLoadTask(transferItemModel));

    }

/**************************************************************************/

    @Override

    public void updateTask() {

//        BaseTransferLoadTask task = LoadUtil.getWaitTask(loadTasks);

//        if (task != null) {

//            startTask(task);

//        }

    }

@Override

    public void addTask(DownLoadTask task) {

if (!needRepeatTask && !loadTasks.contains(task) ||needRepeatTask) {

loadTasks.add(task);

            startTask(task);

        }

}

@Override

    public void deleteTask(DownLoadTask task) {

//        if (task == null) {

//            return;

//        }

//        task.deleteTask();

//        //从队列中移除

//        BaseTransferLoadTask taskCache = LoadUtil.getTaskByTask(loadTasks, task);

//        if (LoadUtil.isSameTask(task, taskCache)) {

//            loadTasks.remove(task);

//        }

    }

@Override

    public void pauseAllTask() {

for (BaseTransferLoadTask task :loadTasks) {

if (task ==null) {

continue;

            }

task.pauseTask();

        }

}

@Override

    public void startAllTask() {

for (BaseTransferLoadTask task :loadTasks) {

if (task ==null) {

continue;

            }

if (task.getModel().getTranferStatus() == LoadStatus.STATE_PAUSE || task.getModel().getTranferStatus() == LoadStatus.STATE_WAIT) {//暂停,等待

                task.startTask();

            }

}

}

public static DownLoadManagergetInstance() {

if (instance ==null) {

synchronized (TAG) {

if (instance ==null) {

instance =new DownLoadManager();

                }

}

}

return instance;

    }

}

/**

* Description: 下载任务

*

* @Autho* Date: 2021/4/27 16:50

**/

public class DownLoadTaskextends BaseTransferLoadTask {

public DownLoadTask(TransferItemModel itemTransferTask) {

super(itemTransferTask);

    }

@Override

    public BaseLoadEnginegetBaseLoadEngine() {

return new DownLoadEngine();

    }

}

/**

* Description: 下载引擎:下载网络交互

*

* @Author:* Date: 2021/4/25 16:34

**/

public class DownLoadEngineextends BaseLoadEngine {

private static final StringTAG ="DownLoadEngine";

    public DownLoadEngine() {

Log.d("DownLoadEngine", "DownLoadEngine init");

    }

/***

    * 开始下载

    * @param transferItemModel

    */

    @Override

    public void startHttpLoad(TransferItemModel transferItemModel) {

super.startHttpLoad(transferItemModel);

    }

/***

    * 暂停下载

    */

    @Override

    public void pauseHttpLoad() {

super.pauseHttpLoad();

    }

/***

    * 取消下载

    */

    @Override

    public void cancelHttpLoad() {

super.cancelHttpLoad();

    }

@Override

    public void resumeHttpLoad() {

super.resumeHttpLoad();

    }

}

Demo地址:https://github.com/pengcaihua123456/shennandadao/tree/master

业务分析:

1.添加上传任务到上传列表中,任务管理类DownLoadManger(操作数据库)

1).添加任务

2).删除任务

3).暂停单个任务(取消任务)

4)  .暂停所以任务

队列:模仿OKHTTP

1).正在运行的队列

2).等待上传的队列

任务优先级如何实现?

应用场景:

用一个队列就算了。

所有队列:正在运行的,等待运行的,暂停的

2.列表的保存,永久保存。数据库设计

注意:暂停,和取消都是要在正式回调之后才行

开始下一个任务:下载完成,取消,暂停

每次任务都要判断状态等

如果杀进程,下一次进来,那些都是下载状态,应该设置为暂停状态

取消任务:要把文件也删除了

计算下载速度:大小/时间,有一个时间段

manager里面是否应该监听状态,这样才知道下一个继续!!!

====================

处理单个任务:

任务分类:根据状态:

1.等待上传

2.正在上传

3.上传完成

4.暂停状态

5.出错状态

和后台交互,接口,监听处理

1.任务参数

2.任务接口(开始,暂停)

3.和服务器的对接

4.下载任务的回调

作者:鹏城十八少

原文链接:https://www.jianshu.com/p/4a78a76dbee6

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐