多任务下载在android app中很多应用场景,比如应用市场下载app,图书下载、音乐下载、电影下载等资源类型下载。
一、什么是多任务下载框架
多任务框架就是指,同一时间内,支持多个资源下载。支持下载队列、进度更新、下载取消暂停等。
包括:网络下载请求,下载任务执行、下载任务调度、UI进度更新、任务状态变化、文件的存储。
二、框架流程
三、框架代码:
下面着重分析下DownloadTask和TaskDispatcher部分代码:
四、任劳任怨的下载器--DownloadTask
DownloadTask实现了Runnable接口,定义了任务状态和网络service。具体参考代码:
/**
* <The trouble with the world is that the stupid are sure and the intelligent are full of doubt.>
* <p>
* HappyBaby
* <p>
* 作者:Jacky.Ao on 2018/2/23 17:08
* <p>
* 邮箱: jiazhi.ao@gmail.com
*/
public class DownloadTask implements Runnable, ProgressListener {
//更新任务进度消息
private static final int UPDATE_PROGRESS_ID = 0x100;
//下载网络服务
private APIService.DownloadApiService downloadApiService;
//上传网络服务
private APIService.UploadApiService uploadApiService;
//下载任务状态
private STATE state;
//下载实体类,使用object基类,方便统一获取
private Object downloadObject;
//网络服务请求参数列表
private List<RequestParameter> parameterList;
//网络下载请求对象
private Call<File> downloadCall;
//网络上传请求对象
private Call<BaseEntity> uploadCall;
//下载保存文件对象
private File downloadFile = null;
//下载任务进度监听器
private OnProgressListener onProgressListener;
private DownloadTask mySelf;
//是否是下载,区分当前任务是下载还是上传
private boolean isDownload;
@Override
public void run() {
start();
}
@Override
public void onProgress(long addedBytes, long contentLenght, boolean done) {
sendUpdateProgressMessage(addedBytes, contentLenght, false);
}
public enum STATE {
IDLE,
PENDING,
LOADING,
FAILED,
FINISHED,
UNKNOWN,
}
private void sendUpdateProgressMessage(long addedBytes, long contentLenght, boolean done) {
Message message = handler.obtainMessage(UPDATE_PROGRESS_ID);
message.obj = done;
message.arg1 = (int) addedBytes;
message.arg2 = (int) contentLenght;
handler.sendMessage(message);
}
private Han