您的位置:首页 > 其它

第二阶段 6、实现全部任务恢复下载及优化

2016-01-15 13:53 281 查看
一、实现全部任务恢复下载

思路:

将所有操作过的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老兄的有心课堂-自己动手写多任务下载框架
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: