第二阶段 1、完善整体流程

来源:互联网 发布:linux无法定位软件包 编辑:程序博客网 时间:2024/06/08 19:09

在上一阶段中,基本流程已经跑通,基本实现用户发起下载操作,DownloadManager调用add方法开启DownloadService服务,DownloadService根据动作类型执行下载任务,被观察者分别在下载前、下载中、下载后通知观察者改变状态

大致流程:

用户–>DownloadManger(开启服务)–>DownloadService(开启任务线程)–>DownloadTask(具体执行)

接下来完善DownloadManager、DownLoadService、DownloadTask

1、DownloadManager

添加暂停,继续下载,取消方法

public void pause(DownloadEntry entry) {  Intent intent = new Intent(context, DownloadService.class);  intent.putExtra(Constant.KEY_DOWNLOAD_ENTRY, entry);  intent.putExtra(Constant.KEY_DOWNLOAD_ACTION, Constant.KEY_DOWNLOAD_ACTION_PAUSE);  context.startService(intent); } public void resume(DownloadEntry entry) {  Intent intent = new Intent(context, DownloadService.class);  intent.putExtra(Constant.KEY_DOWNLOAD_ENTRY, entry);  intent.putExtra(Constant.KEY_DOWNLOAD_ACTION, Constant.KEY_DOWNLOAD_ACTION_RESUME);  context.startService(intent); } public void cancel(DownloadEntry entry) {  Intent intent = new Intent(context, DownloadService.class);  intent.putExtra(Constant.KEY_DOWNLOAD_ENTRY, entry);  intent.putExtra(Constant.KEY_DOWNLOAD_ACTION, Constant.KEY_DOWNLOAD_ACTION_CANCEL);  context.startService(intent); }

2、DownloadService

添加开始下载,暂停下载,继续下载,取消下载方法,并将下载过程移植到DownloadTask中,每一个线程任务要保存到HashMap中,别忘了注册服务啊~

private void doAction(DownloadEntry entry, int action) {  private HashMap<String, DownloadTask> mDownloadingTasks = new HashMap<String, DownloadTask>();  // check action do related action  switch (action) {  case Constant.KEY_DOWNLOAD_ACTION_ADD:   startDownload(entry);   break;  case Constant.KEY_DOWNLOAD_ACTION_PAUSE:   pauseDownload(entry);   break;  case Constant.KEY_DOWNLOAD_ACTION_RESUME:   resumeDownload(entry);   break;  case Constant.KEY_DOWNLOAD_ACTION_CANCEL:   cancelDownload(entry);   break;  default:   break;  } } private void startDownload(DownloadEntry entry) {  DownloadTask task = new DownloadTask(entry);  task.start();  mDownloadingTasks.put(entry.id, task); } private void pauseDownload(DownloadEntry entry) {  DownloadTask task = mDownloadingTasks.remove(entry.id);  if (task != null)   task.pause(); } private void resumeDownload(DownloadEntry entry) { } private void cancelDownload(DownloadEntry entry) {  DownloadTask task = mDownloadingTasks.remove(entry.id);  if (task != null)   task.cancel(); }

3、DownloadTask

描述单个任务的操作细节

public void pause() {  isPaused = true; } public void cancel() {  isCancelled = true; } public void start() {  entry.status = DownloadEntry.DownloadStatus.downloading;  DataChanger.getInstance().postStatus(entry);  // 模拟下载过程  entry.totalLength = 1024 * 100;  for (int i = 0; i < entry.totalLength; i++) {   // 当前下载任务是否是暂停或者取消状态   if (isPaused || isCancelled) {    entry.status = isPaused ? DownloadEntry.DownloadStatus.pause : DownloadEntry.DownloadStatus.cancel;    DataChanger.getInstance().postStatus(entry);    // TODO if cancelled ,delete related file;    return;   }   i += 1024;   entry.currentLength += 1024;   DataChanger.getInstance().postStatus(entry);  }  entry.status = DownloadEntry.DownloadStatus.completed;  DataChanger.getInstance().postStatus(entry); }

相关知识来源:
stay老兄的有心课堂-自己动手写多任务下载框架

0 0
原创粉丝点击