美文网首页
Android 多任务文件断点下载和上传(高仿VIVO应用市场

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

作者: 鹏城十八少 | 来源:发表于2021-04-29 19:02 被阅读0次

    笔者是面霸,面试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.下载任务的回调

    相关文章

      网友评论

          本文标题:Android 多任务文件断点下载和上传(高仿VIVO应用市场

          本文链接:https://www.haomeiwen.com/subject/qiwwrltx.html