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