HTTP组合任务
HTTP组合任务是指多个下载任务打包一起下载,如下载一个视频时,包含了视频、封面、字幕
等信息,使用组合任务,这三个文件的下载共享同一进度。并且这三个文件都将下载到同一文件夹中,效果如下:
一、创建任务
组合任务说明,组合任务会将url集合中的所有文件保存在同一个文件夹中,因此创建任务的时候,你需要设置的文件保存路径是文件夹路径
。
如果你不知道url集合中所有文件的总长度,那么你需要使用unknownSize()
告诉Aria框架。
List<String> subUrls = new ArrayList<>(); // 创建一个http url集合
subUrls.add(videoUrl); // 添加一个视频地址
subUrls.add(tsUrl); // 添加一个字幕地址
subUrls.add(picUrl) // 添加一个视频截图
long taskId = Aria.download(this)
.loadGroup(subUrls) // 设置url集合
.setDirPath(dirPath) // 设置该组合任务的文件夹路径
.unknownSize() // 如果你不知道组合任务的长度请设置这个,需要注意的是,恢复任务时也有加上这个
.create();
通过#create()
,方法,可以创建一个新的下载任务;
不同于普通任务的下载,由于组合任务的特殊性,Aria无法有效快速获取组合任务的总长度,因此需要你使用#setFileSize()
设置组合任务总长度。
如果你无法获取文件总长度,可以参考1.3的设置。
1.1、设置http参数
如果你需要设置http请求参数、header、等信息,见HTTP参数设置
1.2、覆盖路径
在某些情况下,你的文件保存路径可能已经被占用了,但是你只能使用这个路径保存文件,可以使用#setFilePath(filePath, true)
接口强制使用该文件保存路径。
1.3、#unknownSize()
有的时候,你可能无法获取到组合任务的总长度,你可以使用#unknownSize()
告诉Aria,让Aria自动设置长度。
TIP:对于子任务较少的情况,你是可以这样做,对于只任务非常多的情况,非常不建议使用#unknownSize()
,这将会消耗更多的时间才能进入下载流程。
⚠️注意!!如果在创建任务的时候使用了#unknownSize()
,那么恢复组合任务的时候也必须使用#unknownSize()
1.4、设置子任务的文件名
默认情况下,组合任务的文件名是一个随机字符串,这种情况下,可以使用#setSubFileName(List<String>)
来设置每一个子任务的文件名称。
TIP: 设置文件名的列表长度必须和子任务的下载列表长度一致
二、停止、恢复、删除任务
2.1、获取任务id
停止、恢复、删除
任务需要使用任务id。获取任务id的方法有两种,详情见获取任务列表
2.2、停止任务
Aria.downlaod(this).loadGroup(taskId).stop();
2.3、恢复任务
Aria.download(this).loadGroup(taskId).resume();
或
Aria.download(this).loadGroup(taskId).resume(true); // 立即进入执行队列
2.4、删除任务
Aria.download(this).loadGroup(taskId).cancel();
在下载完成的情况下,#cancel()
方法只会删除记录,而不会删除已下载完成的文件,如果你希望在下载完成的情况下删除已下载完成的文件,可以是使用#cancel()
的重载方法#cancel(true)
。
2.5 其他API
除了这些基本的任务控制外,你还可以查看任务控制文档。
三、子任务控制
有的时候,你可以需要手动控制组合任务中某个子任务的下载状态。对于这种需求,可以使用#getSubTaskManager()
获取子任务管理器,然后通过子任务管理器控制子任务的停止、恢复
功能。
3.1、启动组合任务中的一个子任务
Aria.download(this)
.loadGroup(taskId)
.getSubTaskManager()
.startSubTask(subTaskUrl); // 子任务下载地址
3.2、 停止组合任务中的一个子任务
Aria.download(this)
.loadGroup(taskId)
.getSubTaskManager()
.stopSubTask(subTaskUrl); // 子任务下载地址
四、任务状态监听
在Aria中,任务状态是通过java注解获取的。要获取任务状态,你只需要以下几个步骤便可。
1、在#onCreate()
或其它位置注册Aria
Aria.download(this).register();
2、使用注解获取任务状态,如执行中、完成
/*
* 任务执行中
*/
@DownloadGroup.onTaskRunning()
protected void running(DownloadGroupTask task) {
Log.d(TAG, "group running, p = "
+ task.getPercent()
+ ", speed = "
+ task.getConvertSpeed()
+ "current_p = "
+ task.getCurrentProgress());
getBinding().setProgress(task.getPercent());
getBinding().setSpeed(task.getConvertSpeed());
mChildList.updateChildProgress(task.getEntity().getSubEntities());
}
/*
* 任务完成
*/
@DownloadGroup.onTaskComplete()
protected void taskComplete(DownloadGroupTask task) {
getBinding().setProgress(100);
getBinding().setSpeed("");
mChildList.updateChildProgress(task.getEntity().getSubEntities());
T.showShort(this, "任务组下载完成");
L.d(TAG, "任务组下载完成");
getBinding().setStateStr(getString(R.string.start));
}
3、子任务的事件获取
@DownloadGroup.onSubTaskRunning
void onSubTaskRunning(DownloadGroupTask groupTask, DownloadEntity subEntity) {
// 子任务执行中的回调
}
@DownloadGroup.onSubTaskComplete
void onSubTaskComplete(DownloadGroupTask groupTask, DownloadEntity subEntity) {
// 子任务完成的回调
}
⚠️注意:如果你在非Activity或Fragment
中注册了Aria,那么你需要在销毁对象时调用Aria.download(this).unRegister();
取消注册,否则会出现内存泄漏的情况。
👉其它注解👈