第二阶段 6、实现全部任务恢复下载及优化
2016-01-15 13:53
281 查看
一、实现全部任务恢复下载
思路:
将所有操作过的Entry保存起来,当点击恢复所有时,从保存Entry的集合中遍历出所有暂停状态的Entry,依次加入下载队列中,即可实现全部任务的恢复下载功能。
方案:
方案一:在DownloadService中创建保存被操作过得Entry的集合,分别在所有功能操作方法中对该集合进行增删操作。
方案二:在DataChanger中创建该集合,在被观察者通知观察者改变状态前将Entry存入该集合中。
方案的分析与选取:
方案一中,需修改变动的地方很多,由于添加了一个变量,DownloadService中所有与操作状态有关的方法中都要加入对该集合的相关操作,因此修改过程很繁琐。
方案二中,DataChanger相当于所有状态修改变动的入口,只要是被操作过得Entry都会通过DataChanger传递给DataWatcher,因此,在DataChanger中创建该集合,操作既简单又不会有所遗漏,因此,选择方案二。
代码实例:
二、优化
描述:防止用户对同一按钮的快速点击(即同一Entry状态的快速切换)导致数据紊乱的情况
方案:人为增加同一按钮连续操作的间隔时间
代码实例:
相关知识来源:
stay老兄的有心课堂-自己动手写多任务下载框架
思路:
将所有操作过的Entry保存起来,当点击恢复所有时,从保存Entry的集合中遍历出所有暂停状态的Entry,依次加入下载队列中,即可实现全部任务的恢复下载功能。
方案:
方案一:在DownloadService中创建保存被操作过得Entry的集合,分别在所有功能操作方法中对该集合进行增删操作。
方案二:在DataChanger中创建该集合,在被观察者通知观察者改变状态前将Entry存入该集合中。
方案的分析与选取:
方案一中,需修改变动的地方很多,由于添加了一个变量,DownloadService中所有与操作状态有关的方法中都要加入对该集合的相关操作,因此修改过程很繁琐。
方案二中,DataChanger相当于所有状态修改变动的入口,只要是被操作过得Entry都会通过DataChanger传递给DataWatcher,因此,在DataChanger中创建该集合,操作既简单又不会有所遗漏,因此,选择方案二。
代码实例:
1、DataChanger
// 创建集合,将所有被操作过的下载Entry存入该集合 private LinkedHashMap<String, DownloadEntry> mOperatedEntries; private DataChanger() { mOperatedEntries = new LinkedHashMap<String, DownloadEntry>(); } // 添加Entry public void postStatus(DownloadEntry entry) { mOperatedEntries.put(entry.id, entry); setChanged(); notifyObservers(entry); } // 提供对外调用的方法 // 遍历出暂停状态的Entry public ArrayList<DownloadEntry> queryAllRecoverableEntries() { ArrayList<DownloadEntry> mRecoverableEntries = null; for (Map.Entry<String, DownloadEntry> entry : mOperatedEntries.entrySet()) { if (entry.getValue().status == DownloadEntry.DownloadStatus.paused) { if (mRecoverableEntries == null) { mRecoverableEntries = new ArrayList<DownloadEntry>(); } mRecoverableEntries.add(entry.getValue()); } } return mRecoverableEntries; }
2、DownloadService
// 将暂停状态的Entry加入下载集合中 private void recoverAll() { ArrayList<DownloadEntry> mRecoverableEntries = DataChanger.getInstance().queryAllRecoverableEntries(); if (mRecoverableEntries != null) { for (DownloadEntry entry : mRecoverableEntries) { addDownload(entry); } } } // doAction中添加该动作类型 case Constant.KEY_DOWNLOAD_RECOVER_ALL: recoverAll(); break;
3、DownloadManager
调用DownloadService的recoverAll()方法public void recoverAll() { Intent intent = new Intent(context, DownloadService.class); intent.putExtra(Constant.KEY_DOWNLOAD_ACTION, Constant.KEY_DOWNLOAD_ACTION_RECOVER_ALL); context.startService(intent); }
4、ListActivity
调用DownloadManager的recoverAll@Override public void onClick(View v) { switch (v.getId()) { case R.id.mRecoverAllBtn: mDownloadManager.recoverAll(); break; } }
二、优化
描述:防止用户对同一按钮的快速点击(即同一Entry状态的快速切换)导致数据紊乱的情况
方案:人为增加同一按钮连续操作的间隔时间
代码实例:
1、DownloadManager
// 创建间隔时间判断的常量和方法 private static final int MIN_OPERATE_INTERVAL = 1000 * 1; private long mLastOperatedTime = 0; private boolean checkIfExecutable() { long tmp = System.currentTimeMillis(); if (tmp - mLastOperatedTime > MIN_OPERATE_INTERVAL) { mLastOperatedTime = tmp; return true; } return false; } // 添加间隔时间判断逻辑 // 下载 public void add(DownloadEntry entry) { checkIfExecutable(); Intent intent = new Intent(context, DownloadService.class); intent.putExtra(Constant.KEY_DOWNLOAD_ENTRY, entry); intent.putExtra(Constant.KEY_DOWNLOAD_ACTION, Constant.KEY_DOWNLOAD_ACTION_ADD); context.startService(intent); } // 暂停 public void pause(DownloadEntry entry) { if (!checkIfExecutable()) return; 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) { if (!checkIfExecutable()) return; 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) { if (!checkIfExecutable()) return; 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、DownloadTask
强制刷新连个变量,确保每次读取的都是最新的数据private volatile boolean isPaused; private volatile boolean isCancelled;
相关知识来源:
stay老兄的有心课堂-自己动手写多任务下载框架
相关文章推荐
- iOS开发UI篇—CAlayer(自定义layer)
- linux 用户添加root权限
- MIT,Apache 等协议如何理解?
- Windows 10 IoT Core Samples
- blob clob区别
- 面试题——常见5种运行时异常
- AngularJS中实现无限级联动菜单(使用demo)
- [软件推荐]一款win7 x86 x64都能用的免费内存虚拟盘的小工具——ImDisk
- Docker学习笔记之一
- json字符串在js中转化为json对象
- 第二阶段 5、实现全部任务的暂停
- java图像
- HDu 1058 丑数 (打表||DP,好题啊!!!)
- 杭电1045 Fire Net(dfs过)(图搜)
- STL_算法_transform
- Swift 懒加载(lazy) 和 Objective-C 懒加载的区别
- vSan中见证组件witness详解
- Android UI布局优化之ViewStub
- iOS开发篇(一)Cocoapods环境的配置
- 通过VS2015查看GitHub上的微软官方例子学习UWP