下载器

DownloadManager.cs 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace TModule.Runtime
  6. {
  7. public class DownloadManager : MonoBehaviour
  8. {
  9. private List<DownloadRoutine> _downloadRoutines = new List<DownloadRoutine>();
  10. private Queue<DownloadFileInfo> downloadFiles = new Queue<DownloadFileInfo>();
  11. /// <summary>
  12. /// 最大下载器数量
  13. /// </summary>
  14. public int m_maxCount = 5;
  15. private void Awake()
  16. {
  17. for (int i = 0; i < m_maxCount; i++)
  18. {
  19. _downloadRoutines.Add(new DownloadRoutine());
  20. }
  21. }
  22. /// <summary>
  23. /// 暂停下载
  24. /// </summary>
  25. /// <param name="url"></param>
  26. /// <param name="savePath"></param>
  27. public void StopDownload(string url, string savePath)
  28. {
  29. _downloadRoutines.Find(p => p.DownLoadUrl == url && p.FileSavePath == savePath)?.StopDownload();
  30. }
  31. /// <summary>
  32. /// 暂停下载
  33. /// </summary>
  34. /// <param name="fileInfo"></param>
  35. public void StopDownload(DownloadFileInfo fileInfo)
  36. {
  37. StopDownload(fileInfo.m_url, fileInfo.m_savePath);
  38. }
  39. /// <summary>
  40. /// 暂停所有下载
  41. /// </summary>
  42. public void StopAllDownload()
  43. {
  44. foreach (var item in _downloadRoutines)
  45. {
  46. if (!item.IsLeisure)
  47. item.StopDownload();
  48. }
  49. }
  50. /// <summary>
  51. /// 开始下载
  52. /// </summary>
  53. /// <param name="url"></param>
  54. /// <param name="savePath"></param>
  55. /// <param name="onProgress"></param>
  56. /// <param name="onOver"></param>
  57. /// <param name="onError"></param>
  58. public void StartDownload(string url,string savePath,Action<float,long,long>onProgress=null,Action onOver=null,Action<string> onError=null)
  59. {
  60. StartDownload(new DownloadFileInfo
  61. {
  62. m_savePath = savePath,
  63. m_url = url,
  64. onErroe = onError,
  65. onOver = onOver,
  66. onProgress = onProgress
  67. });
  68. }
  69. /// <summary>
  70. /// 开始下载
  71. /// </summary>
  72. /// <param name="fileInfo"></param>
  73. public void StartDownload(DownloadFileInfo fileInfo)
  74. {
  75. DownloadRoutine routine = GetLeisureDownloadRoutine();
  76. if (routine == null)
  77. downloadFiles.Enqueue(fileInfo);
  78. else
  79. {
  80. routine.onProgress = fileInfo.onProgress;
  81. routine.onDownloadOver = ()=> { fileInfo.onOver?.Invoke(); CheckIsOver();};
  82. routine.onError = fileInfo.onErroe;
  83. routine.StartDownload(fileInfo.m_url, fileInfo.m_savePath);
  84. }
  85. }
  86. /// <summary>
  87. /// 批量下载
  88. /// </summary>
  89. /// <param name="fileInfos"></param>
  90. public void BatchDownload(IEnumerable<DownloadFileInfo> fileInfos)
  91. {
  92. foreach (var item in fileInfos)
  93. {
  94. StartDownload(item);
  95. }
  96. }
  97. /// <summary>
  98. /// 继续下载
  99. /// </summary>
  100. /// <param name="url"></param>
  101. /// <param name="savePath"></param>
  102. public void ContinueDownload(string url,string savePath)
  103. {
  104. _downloadRoutines.Find(p => p.DownLoadUrl == url && p.FileSavePath == savePath)?.ContinueDownload();
  105. }
  106. /// <summary>
  107. /// 继续下载
  108. /// </summary>
  109. /// <param name="fileInfo"></param>
  110. public void ContinueDownload(DownloadFileInfo fileInfo)
  111. {
  112. ContinueDownload(fileInfo.m_url, fileInfo.m_savePath);
  113. }
  114. /// <summary>
  115. /// 全部继续下载
  116. /// </summary>
  117. public void ContinueAllDownload()
  118. {
  119. foreach (var item in _downloadRoutines)
  120. {
  121. if (!item.IsLeisure && item.IsStop)
  122. item.ContinueDownload();
  123. }
  124. }
  125. private void CheckIsOver()
  126. {
  127. lock(downloadFiles)
  128. {
  129. if (downloadFiles.Count > 0)
  130. {
  131. StartDownload(downloadFiles.Dequeue());
  132. }
  133. }
  134. }
  135. /// <summary>
  136. /// 获取空闲下载器
  137. /// </summary>
  138. /// <returns></returns>
  139. private DownloadRoutine GetLeisureDownloadRoutine()
  140. {
  141. return _downloadRoutines.Find(p => p.IsLeisure);
  142. }
  143. }
  144. }