问题背景
默认情况下,上传和下载任务都是按代码里固定的并发度执行,例如固定 3 个并发。
在实测中发现:
- 在网络/磁盘较弱的设备上,并发过高会带来明显卡顿和失败;
- 在性能较强的设备上,又希望能提高并发度来加快整体速度。
使用上需要一个简单的方式,能根据自己的环境调节上传/下载并发。
目标
- 在设置页提供两个滑动条:
- 上传并发:范围 1–30;
- 下载并发:范围 1–30。
- 并发设置要持久化,下次启动生效;
- 传输调度逻辑要遵守这个并发上限。
方案设计
状态层并发调度模型
- 在
AppState中维护:- 配置:
_uploadConcurrency、_downloadConcurrency; - 运行时计数:
_runningUploads、_runningDownloads; - 排队队列:上传队列
_uploadQueue、下载队列_downloadQueue。
- 配置:
- 新任务加入时:
- 如果当前运行数 < 并发上限,立即启动;
- 否则进入队列等待。
- 每个任务结束时:
- 递减对应的 running 计数;
- 尝试从队列中取出下一个任务启动,直到达到并发上限。
这样可以保证最大并发数可配置且不会超限。
设置页 UI 与持久化
- 设置页增加两个
Slider:- 最小值 1,最大值 30,divisions=29;
- 当前值来自
AppState的并发配置。
- 每次滑动时:
- 调用
setUploadConcurrency/setDownloadConcurrency更新状态; - 同时写入
SharedPreferences对应的 key; - 下次启动时在
_loadPreferences中加载,夹在 1–30 范围内。
- 调用
收获
- 把“并发度”开放出来,可以适配不同设备和网络,不必用一个固定值硬撑所有场景。
- 实现上要区分:
- 配置层面的并发上限;
- 运行时的执行调度(队列 + running 计数)。
清楚这两个角色后,代码结构会比较自然。