File was renamed from Main/System/AssetVersion/DownloadMgr.cs |
| | |
| | | using Cysharp.Threading.Tasks; |
| | | |
| | | |
| | | public class DownloadMgr : SingletonMonobehaviour<DownloadMgr> |
| | | public class DownloadHotMgr : SingletonMonobehaviour<DownloadHotMgr> |
| | | { |
| | | #region 配置 |
| | | public static int MaxRetryTimes = 5;//最大重试的次数 |
| | |
| | | #endregion |
| | | |
| | | #region 任务列表 |
| | | private Dictionary<string, DownloadTask> allTask = new Dictionary<string, DownloadTask>(); //所有任务组 |
| | | private Queue<DownloadTask> waitTask = new Queue<DownloadTask>(); //当前等待下载的任务 |
| | | private Dictionary<string, DownloadTask> downloadTask = new Dictionary<string, DownloadTask>(); //当前正在下载的任务 |
| | | private Dictionary<string, DownloadHotTask> allTask = new Dictionary<string, DownloadHotTask>(); //所有任务组 |
| | | private Queue<DownloadHotTask> waitTask = new Queue<DownloadHotTask>(); //当前等待下载的任务 |
| | | private Dictionary<string, DownloadHotTask> downloadTask = new Dictionary<string, DownloadHotTask>(); //当前正在下载的任务 |
| | | #endregion 任务列表 |
| | | |
| | | private bool isBegin; |
| | | private int startTickcount = 0; |
| | | private Func<bool, DownloadTask, bool> onTaskCompleted;//文件下载完成回调,<是否全部完成,任务对象,return true:立即重试,false:到队尾重试> |
| | | private Func<bool, DownloadHotTask, bool> onTaskCompleted;//文件下载完成回调,<是否全部完成,任务对象,return true:立即重试,false:到队尾重试> |
| | | |
| | | //总速度 |
| | | private float speed; |
| | |
| | | } |
| | | |
| | | //添加任务 |
| | | public DownloadMgr AddTask(DownloadTask task) |
| | | public DownloadHotMgr AddTask(DownloadHotTask task) |
| | | { |
| | | if (allTask.ContainsKey(task.Key)) |
| | | { |
| | |
| | | } |
| | | |
| | | //准备下载,重置状态 |
| | | public DownloadMgr Prepare() |
| | | public DownloadHotMgr Prepare() |
| | | { |
| | | Stop(); |
| | | this.onTaskCompleted = null; |
| | |
| | | /// </summary> |
| | | /// <param name="onTaskCompleted">任务结束回调</param> |
| | | /// <returns></returns> |
| | | public DownloadMgr Begin(Func<bool, DownloadTask, bool> onTaskCompleted = null) |
| | | public DownloadHotMgr Begin(Func<bool, DownloadHotTask, bool> onTaskCompleted = null) |
| | | { |
| | | this.onTaskCompleted = onTaskCompleted; |
| | | startTickcount = TimeUtility.AllSeconds; |
| | |
| | | } |
| | | |
| | | // 任务下载完成 |
| | | private void OnTaskCompleted(DownloadTask task) |
| | | private void OnTaskCompleted(DownloadHotTask task) |
| | | { |
| | | downloadTask.Remove(task.Key); |
| | | if (task.IsDone)//下载成功 |
| | |
| | | |
| | | |
| | | |
| | | public class DownloadTask |
| | | public class DownloadHotTask |
| | | { |
| | | //下载任务状态 |
| | | public enum TaskState |
| | |
| | | public readonly string tempFile;//临时文件地址 |
| | | private readonly bool clearCache;//是否清除旧的下载缓存,(断点续传) |
| | | public readonly object obj; //自定义对象 |
| | | private Action<DownloadTask> onCompleted;//下载完成回调 |
| | | private Action<DownloadHotTask> onCompleted;//下载完成回调 |
| | | private TaskState state;//下载状态 |
| | | |
| | | public bool isStop;//下载被停止 |
| | |
| | | /// <param name="localUrl">本地保存地址</param> |
| | | /// <param name="obj">自定义对象</param> |
| | | /// <param name="clearCache">是否清除上次下载的缓存</param> |
| | | public DownloadTask(string remoteUrl, string localUrl, object obj = null, bool clearCache = false) |
| | | public DownloadHotTask(string remoteUrl, string localUrl, object obj = null, bool clearCache = false) |
| | | { |
| | | this.remoteUrl = remoteUrl; |
| | | this.localFile = localUrl; |
| | |
| | | if (IsWorking) |
| | | return; |
| | | |
| | | Co_GetHeader(); |
| | | Co_GetHeader().Forget(); |
| | | // SnxxzGame.Instance.StartCoroutine(Co_GetHeader()); |
| | | } |
| | | |
| | | public bool BeginDownload(Action<DownloadTask> onCompleted) |
| | | public bool BeginDownload(Action<DownloadHotTask> onCompleted) |
| | | { |
| | | if ((IsWorking && requestHeaderOk) || IsDone)//已经在下载任务中或已经下载完成了 |
| | | return false; |
| | |
| | | failedTimes = 0; |
| | | this.onCompleted = onCompleted; |
| | | this.isStop = false; |
| | | Co_DownloadFile(); |
| | | Co_DownloadFile().Forget(); |
| | | // SnxxzGame.Instance.StartCoroutine(Co_DownloadFile()); |
| | | return true; |
| | | } |
| | |
| | | Debug.LogFormat("开始获取头信息:{0}", remoteUrl); |
| | | using (var www = UnityWebRequest.Head(remoteUrl)) |
| | | { |
| | | www.timeout = DownloadMgr.TimeOut; |
| | | www.timeout = DownloadHotMgr.TimeOut; |
| | | await www.SendWebRequest(); |
| | | if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError) |
| | | { |
| | |
| | | |
| | | private async UniTask Move(string sourceFile, string destFile) |
| | | { |
| | | |
| | | var copyState = 0;//复制文件状态,0等待,1成功,2失败 |
| | | try |
| | | { |
| | |
| | | } |
| | | else |
| | | SetFailed("临时文件改名出错"); |
| | | |
| | | await UniTask.CompletedTask; |
| | | } |
| | | |
| | | } |