断点续传与任务恢复机制
为什么能断点续传
逐图下载时,JHenTai 把每个画廊和每张图片的下载进度持久化到本地数据库(Drift SQLite)。应用关闭、意外崩溃、设备重启后再次打开,下载页面会自动恢复上次所有未完成的任务——从断点继续,不从头开始。
持久化了哪些状态
- 画廊下载进度:已下载多少张、还剩多少张
- 每张图片的已下载字节数:HTTP 断点续传所需的 offset
- 当前下载优先级和分组
- 下载开始时间、最后活动时间
这些状态在数据库中实时更新,每完成一张图片就写一次记录。
应用重启后的恢复流程
- 应用启动 → DownloadService 初始化
- 从数据库读取所有状态为"下载中"或"暂停"的任务
- EHExecutor 按优先级重新排队
- 任务恢复执行,从每张图片已下载的字节数继续
恢复失败的情况
以下情况可能导致断点续传失效或需要重新下载:
| 原因 | 处理方式 |
|---|---|
| 网络环境变了,EH 临时 CDN 返回的图片地址可能带 token 已过期 | 应用检测到 token 失效后会自动重新请求,不需要用户操作 |
| 应用数据被清理(如清理存储权限或手动清除应用数据) | 数据库被清空,所有下载进度丢失 |
| 手动删除了下载目录里已有的图片文件 | JHenTai 检测到文件不存在会重新下载 |
| 画廊上传者上传了新版本 | 应用会提示是否重新下载(见 上传者更新同步) |
Archive Bot 下载的断点续传
Archive Bot 下载是单个大文件的 HTTP 下载——这个层面的断点续传由 HTTP Range 请求和下载工具处理。JHenTai 本身不单独处理 Archive Bot 文件的断点,但底层 HTTP 库(Dio)支持,所以效果与逐图下载的断点续传一致。
手动暂停与恢复
下载管理页面上每个任务都有暂停和继续按钮:
- 暂停:从执行队列中移除,数据库状态更新为"暂停"
- 继续:重新加入 EHExecutor 队列,按原优先级执行
- 取消:删除下载任务及其所有进度记录
- 清理已完成:批量删除已完成的下载任务卡片(已下载的图片文件保留)