修复恢复所有任务时,不能恢复任务组的bug
This commit is contained in:
@ -16,15 +16,17 @@
|
||||
|
||||
package com.arialyy.aria.core.command.normal;
|
||||
|
||||
import android.os.Handler;
|
||||
import com.arialyy.aria.core.command.AbsCmd;
|
||||
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||
import com.arialyy.aria.core.inf.AbsEntity;
|
||||
import com.arialyy.aria.core.inf.AbsTask;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
import com.arialyy.aria.core.queue.DownloadGroupTaskQueue;
|
||||
import com.arialyy.aria.core.queue.DownloadTaskQueue;
|
||||
import com.arialyy.aria.core.queue.UploadTaskQueue;
|
||||
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
||||
import com.arialyy.aria.util.CheckUtil;
|
||||
import com.arialyy.aria.util.CommonUtil;
|
||||
|
||||
/**
|
||||
@ -32,12 +34,13 @@ import com.arialyy.aria.util.CommonUtil;
|
||||
* 下载命令
|
||||
*/
|
||||
public abstract class AbsNormalCmd<T extends AbsTaskEntity> extends AbsCmd<T> {
|
||||
|
||||
/**
|
||||
* 能否执行命令
|
||||
*/
|
||||
boolean canExeCmd = true;
|
||||
|
||||
private AbsTask tempTask = null;
|
||||
|
||||
/**
|
||||
* @param targetName 产生任务的对象名
|
||||
*/
|
||||
@ -58,4 +61,90 @@ public abstract class AbsNormalCmd<T extends AbsTaskEntity> extends AbsCmd<T> {
|
||||
isDownloadCmd = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除所有任务
|
||||
*/
|
||||
void removeAll() {
|
||||
mQueue.removeAllTask();
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止所有任务
|
||||
*/
|
||||
void stopAll() {
|
||||
mQueue.stopAllTask();
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止任务
|
||||
*/
|
||||
void stopTask() {
|
||||
if (tempTask == null) createTask();
|
||||
mQueue.stopTask(tempTask);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除任务
|
||||
*/
|
||||
void removeTask() {
|
||||
if (tempTask == null) createTask();
|
||||
mQueue.removeTask(tempTask);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动任务
|
||||
*/
|
||||
void startTask() {
|
||||
mQueue.startTask(tempTask);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动指定任务
|
||||
*
|
||||
* @param task 指定任务
|
||||
*/
|
||||
void startTask(AbsTask task) {
|
||||
mQueue.startTask(task);
|
||||
}
|
||||
|
||||
/**
|
||||
* 从队列中获取任务
|
||||
*
|
||||
* @return 执行任务
|
||||
*/
|
||||
AbsTask getTask() {
|
||||
tempTask = mQueue.getTask(mTaskEntity.getEntity());
|
||||
return tempTask;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从队列中获取任务
|
||||
*
|
||||
* @return 执行任务
|
||||
*/
|
||||
AbsTask getTask(AbsEntity entity) {
|
||||
tempTask = mQueue.getTask(entity);
|
||||
return tempTask;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建任务
|
||||
*
|
||||
* @return 创建的任务
|
||||
*/
|
||||
AbsTask createTask() {
|
||||
tempTask = mQueue.createTask(mTargetName, mTaskEntity);
|
||||
return tempTask;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建指定实体的任务
|
||||
*
|
||||
* @param taskEntity 特定的任务实体
|
||||
* @return 创建的任务
|
||||
*/
|
||||
AbsTask createTask(AbsTaskEntity taskEntity) {
|
||||
return mQueue.createTask(mTargetName, taskEntity);
|
||||
}
|
||||
}
|
@ -33,10 +33,10 @@ class AddCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
|
||||
@Override public void executeCmd() {
|
||||
if (!canExeCmd) return;
|
||||
AbsTask task = mQueue.getTask(mTaskEntity.getEntity());
|
||||
AbsTask task = getTask();
|
||||
if (task == null) {
|
||||
mTaskEntity.getEntity().setState(IEntity.STATE_WAIT);
|
||||
mQueue.createTask(mTargetName, mTaskEntity);
|
||||
createTask();
|
||||
} else {
|
||||
Log.w(TAG, "添加命令执行失败,【该任务已经存在】");
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ final class CancelAllCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
}
|
||||
|
||||
@Override public void executeCmd() {
|
||||
mQueue.removeAllTask();
|
||||
removeAll();
|
||||
if (mTaskEntity instanceof DownloadTaskEntity) {
|
||||
handleDownloadRemove();
|
||||
} else if (mTaskEntity instanceof UploadTaskEntity){
|
||||
|
@ -17,7 +17,6 @@
|
||||
package com.arialyy.aria.core.command.normal;
|
||||
|
||||
import android.text.TextUtils;
|
||||
import com.arialyy.aria.core.inf.AbsNormalTask;
|
||||
import com.arialyy.aria.core.inf.AbsTask;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
|
||||
@ -32,15 +31,10 @@ class CancelCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
|
||||
@Override public void executeCmd() {
|
||||
if (!canExeCmd) return;
|
||||
AbsTask task = mQueue.getTask(mTaskEntity.getEntity());
|
||||
if (task == null) {
|
||||
task = mQueue.createTask(mTargetName, mTaskEntity);
|
||||
}
|
||||
if (task != null) {
|
||||
if (!TextUtils.isEmpty(mTargetName)) {
|
||||
task.setTargetName(mTargetName);
|
||||
}
|
||||
mQueue.removeTask(task);
|
||||
AbsTask task = getTask();
|
||||
if (!TextUtils.isEmpty(mTargetName)) {
|
||||
task.setTargetName(mTargetName);
|
||||
}
|
||||
removeTask();
|
||||
}
|
||||
}
|
@ -43,9 +43,9 @@ final class HighestPriorityCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T>
|
||||
|
||||
@Override public void executeCmd() {
|
||||
if (!canExeCmd) return;
|
||||
DownloadTask task = (DownloadTask) mQueue.getTask(mTaskEntity.getEntity());
|
||||
DownloadTask task = (DownloadTask) getTask();
|
||||
if (task == null) {
|
||||
task = (DownloadTask) mQueue.createTask(mTargetName, mTaskEntity);
|
||||
task = (DownloadTask) createTask();
|
||||
}
|
||||
if (task != null) {
|
||||
if (!TextUtils.isEmpty(mTargetName)) {
|
||||
|
@ -1,11 +1,10 @@
|
||||
package com.arialyy.aria.core.command.normal;
|
||||
|
||||
import android.util.Log;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
|
||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||
import com.arialyy.aria.core.inf.AbsTask;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
import com.arialyy.aria.core.inf.IEntity;
|
||||
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
||||
import com.arialyy.aria.orm.DbEntity;
|
||||
import java.util.List;
|
||||
|
||||
@ -24,29 +23,58 @@ final class ResumeAllCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
}
|
||||
|
||||
@Override public void executeCmd() {
|
||||
List<DownloadEntity> allEntity =
|
||||
DbEntity.findDatas(DownloadEntity.class, "state=?", IEntity.STATE_STOP + "");
|
||||
for (DownloadEntity entity : allEntity) {
|
||||
int exeNum = mQueue.getCurrentExePoolNum();
|
||||
if (exeNum == 0 || exeNum < mQueue.getMaxTaskNum()) {
|
||||
AbsTask task = createTask(entity);
|
||||
mQueue.startTask(task);
|
||||
} else {
|
||||
entity.setState(IEntity.STATE_WAIT);
|
||||
createTask(entity);
|
||||
}
|
||||
if (isDownloadCmd) {
|
||||
resumeDownload();
|
||||
} else {
|
||||
resumeUpload();
|
||||
}
|
||||
}
|
||||
|
||||
private AbsTask createTask(DownloadEntity entity) {
|
||||
AbsTask task = mQueue.getTask(entity);
|
||||
if (task == null) {
|
||||
DownloadTaskEntity taskEntity = new DownloadTaskEntity();
|
||||
taskEntity.entity = entity;
|
||||
task = mQueue.createTask(mTargetName, taskEntity);
|
||||
} else {
|
||||
Log.w(TAG, "添加命令执行失败,【该任务已经存在】");
|
||||
/**
|
||||
* 恢复下载,包括普通任务和任务组
|
||||
*/
|
||||
private void resumeDownload() {
|
||||
List<DownloadTaskEntity> dTaskEntity =
|
||||
DbEntity.findDatas(DownloadTaskEntity.class, "isGroupTask=?", "false");
|
||||
for (DownloadTaskEntity te : dTaskEntity) {
|
||||
int state = te.getState();
|
||||
if (state == IEntity.STATE_COMPLETE || state == IEntity.STATE_FAIL) continue;
|
||||
resumeEntity(te);
|
||||
}
|
||||
|
||||
List<DownloadGroupTaskEntity> groupTask = DbEntity.findAllData(DownloadGroupTaskEntity.class);
|
||||
for (DownloadGroupTaskEntity te : groupTask) {
|
||||
int state = te.getState();
|
||||
if (state == IEntity.STATE_COMPLETE || state == IEntity.STATE_FAIL) continue;
|
||||
resumeEntity(te);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 恢复上传,包括普通任务和任务组
|
||||
*/
|
||||
private void resumeUpload() {
|
||||
List<UploadTaskEntity> dTaskEntity =
|
||||
DbEntity.findDatas(UploadTaskEntity.class, "isGroupTask=?", "false");
|
||||
for (UploadTaskEntity te : dTaskEntity) {
|
||||
int state = te.getState();
|
||||
if (state == IEntity.STATE_COMPLETE || state == IEntity.STATE_FAIL) continue;
|
||||
resumeEntity(te);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 恢复实体任务
|
||||
*
|
||||
* @param te 任务实体
|
||||
*/
|
||||
private void resumeEntity(AbsTaskEntity te) {
|
||||
int exeNum = mQueue.getCurrentExePoolNum();
|
||||
if (exeNum == 0 || exeNum < mQueue.getMaxTaskNum()) {
|
||||
startTask(createTask(te));
|
||||
} else {
|
||||
te.getEntity().setState(IEntity.STATE_WAIT);
|
||||
createTask(te);
|
||||
}
|
||||
return task;
|
||||
}
|
||||
}
|
||||
|
@ -47,26 +47,26 @@ class StartCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
maxTaskNum = manager.getUploadConfig().getMaxTaskNum();
|
||||
}
|
||||
|
||||
AbsTask task = mQueue.getTask(mTaskEntity.getEntity());
|
||||
AbsTask task = getTask();
|
||||
if (task == null) {
|
||||
task = mQueue.createTask(mTargetName, mTaskEntity);
|
||||
task = createTask();
|
||||
if (!TextUtils.isEmpty(mTargetName)) {
|
||||
task.setTargetName(mTargetName);
|
||||
}
|
||||
// 任务不存在时,根据配置不同,对任务执行操作
|
||||
if (mod.equals(QueueMod.NOW.getTag())) {
|
||||
mQueue.startTask(task);
|
||||
startTask();
|
||||
} else if (mod.equals(QueueMod.WAIT.getTag())) {
|
||||
if (mQueue.getCurrentExePoolNum() < maxTaskNum
|
||||
|| task.getState() == IEntity.STATE_STOP
|
||||
|| task.getState() == IEntity.STATE_COMPLETE) {
|
||||
mQueue.startTask(task);
|
||||
startTask();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 任务不存在时,根据配置不同,对任务执行操作
|
||||
if (!task.isRunning()) {
|
||||
mQueue.startTask(task);
|
||||
startTask();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,6 @@ final class StopAllCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
}
|
||||
|
||||
@Override public void executeCmd() {
|
||||
mQueue.stopAllTask();
|
||||
stopAll();
|
||||
}
|
||||
}
|
||||
|
@ -34,11 +34,10 @@ class StopCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
|
||||
@Override public void executeCmd() {
|
||||
if (!canExeCmd) return;
|
||||
AbsTask task = mQueue.getTask(mTaskEntity.getEntity());
|
||||
AbsTask task = getTask();
|
||||
if (task == null) {
|
||||
if (mTaskEntity.getEntity().getState() == IEntity.STATE_RUNNING) {
|
||||
task = mQueue.createTask(mTargetName, mTaskEntity);
|
||||
mQueue.stopTask(task);
|
||||
stopTask();
|
||||
} else {
|
||||
Log.w(TAG, "停止命令执行失败,【调度器中没有该任务】");
|
||||
}
|
||||
@ -46,7 +45,7 @@ class StopCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
if (!TextUtils.isEmpty(mTargetName)) {
|
||||
task.setTargetName(mTargetName);
|
||||
}
|
||||
mQueue.stopTask(task);
|
||||
stopTask();
|
||||
}
|
||||
}
|
||||
}
|
119
Aria/src/main/java/com/arialyy/aria/core/queue/QueueControl.java
Normal file
119
Aria/src/main/java/com/arialyy/aria/core/queue/QueueControl.java
Normal file
@ -0,0 +1,119 @@
|
||||
/*
|
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.core.queue;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.util.SparseArray;
|
||||
import com.arialyy.aria.core.inf.AbsEntity;
|
||||
import com.arialyy.aria.core.inf.AbsTask;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
|
||||
/**
|
||||
* Created by Aria.Lao on 2017/8/3.
|
||||
* 队列控制器,用于处理各种命令
|
||||
*/
|
||||
public class QueueControl implements Handler.Callback {
|
||||
/**
|
||||
* 获取任务命令
|
||||
*/
|
||||
public static final int CMD_GET_TASK = 0xa1;
|
||||
/**
|
||||
* 创建任务命令
|
||||
*/
|
||||
public static final int CMD_CREATE_TASK = 0xa2;
|
||||
/**
|
||||
* 启动任务命令
|
||||
*/
|
||||
public static final int CMD_START_TASK = 0xa3;
|
||||
/**
|
||||
* 停止任务命令
|
||||
*/
|
||||
public static final int CMD_STOP_TASK = 0xa4;
|
||||
/**
|
||||
* 删除任务命令
|
||||
*/
|
||||
public static final int CMD_CANCEL_TASK = 0xa5;
|
||||
/**
|
||||
* 停止所有任务命令
|
||||
*/
|
||||
public static final int CMD_STOP_ALL_TASK = 0xa6;
|
||||
/**
|
||||
* 删除所有任务命令
|
||||
*/
|
||||
public static final int CMD_CANCEL_ALL_TASK = 0xa7;
|
||||
|
||||
/**
|
||||
* 队列类型为单文件下载队列
|
||||
*/
|
||||
public static final int TYPE_SIMPLE_DOWNLOAD_QUEUE = 0xc1;
|
||||
/**
|
||||
* 队列类型为任务组下载队列
|
||||
*/
|
||||
public static final int TYPE_SIMPLE_DOWNLOAD_GROUP_QUEUE = 0xc2;
|
||||
/**
|
||||
* 队列类型为单文件上传队列
|
||||
*/
|
||||
public static final int TYPE_SIMPLE_UPLOAD_QUEUE = 0xc3;
|
||||
|
||||
private Handler outHandler;
|
||||
private AbsTaskQueue queue;
|
||||
|
||||
public QueueControl(Handler.Callback callback, int type) {
|
||||
outHandler = new Handler(callback);
|
||||
switch (type) {
|
||||
case TYPE_SIMPLE_DOWNLOAD_QUEUE:
|
||||
queue = DownloadTaskQueue.getInstance();
|
||||
break;
|
||||
case TYPE_SIMPLE_DOWNLOAD_GROUP_QUEUE:
|
||||
queue = DownloadGroupTaskQueue.getInstance();
|
||||
break;
|
||||
case TYPE_SIMPLE_UPLOAD_QUEUE:
|
||||
queue = UploadTaskQueue.getInstance();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override public boolean handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case CMD_GET_TASK:
|
||||
outHandler.obtainMessage(CMD_GET_TASK, queue.getTask((AbsEntity) msg.obj)).sendToTarget();
|
||||
break;
|
||||
case CMD_CREATE_TASK:
|
||||
SparseArray params = (SparseArray) msg.obj;
|
||||
outHandler.obtainMessage(CMD_CREATE_TASK,
|
||||
queue.createTask(String.valueOf(params.get(1)), (AbsTaskEntity) params.get(2)))
|
||||
.sendToTarget();
|
||||
break;
|
||||
case CMD_START_TASK:
|
||||
queue.startTask((AbsTask) msg.obj);
|
||||
break;
|
||||
case CMD_STOP_TASK:
|
||||
queue.stopTask((AbsTask) msg.obj);
|
||||
break;
|
||||
case CMD_CANCEL_TASK:
|
||||
queue.removeTask((AbsTask) msg.obj);
|
||||
break;
|
||||
case CMD_STOP_ALL_TASK:
|
||||
queue.stopAllTask();
|
||||
break;
|
||||
case CMD_CANCEL_ALL_TASK:
|
||||
queue.removeAllTask();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -37,7 +37,7 @@ import java.io.File;
|
||||
public class FtpDownloadActivity extends BaseActivity<ActivityFtpDownloadBinding> {
|
||||
//private final String URL = "ftp://172.18.104.129:21/haha/large.rar";
|
||||
//private final String URL = "ftp://172.18.104.129:21/haha/large.rar";
|
||||
private final String URL = "ftp://172.18.104.129:21/haha/很大的文件_v100.rar";
|
||||
private final String URL = "ftp://172.18.104.66:21/haha/成都.mp3";
|
||||
|
||||
@Override protected void init(Bundle savedInstanceState) {
|
||||
super.init(savedInstanceState);
|
||||
@ -113,7 +113,7 @@ public class FtpDownloadActivity extends BaseActivity<ActivityFtpDownloadBinding
|
||||
getBinding().setSpeed("");
|
||||
getBinding().setProgress(100);
|
||||
Log.d(TAG, "md5 ==> " + CommonUtil.getFileMD5(new File(task.getDownloadPath())));
|
||||
T.showShort(this, "FTP下载完成");
|
||||
T.showShort(this, "文件:" + task.getEntity().getFileName() + ",下载完成");
|
||||
}
|
||||
|
||||
@Override protected int setLayoutId() {
|
||||
|
@ -34,8 +34,8 @@ import com.arialyy.simple.databinding.ActivityFtpUploadBinding;
|
||||
* Ftp 文件上传demo
|
||||
*/
|
||||
public class FtpUploadActivity extends BaseActivity<ActivityFtpUploadBinding> {
|
||||
private final String FILE_PATH = "/mnt/sdcard/gggg.apk";
|
||||
private final String URL = "ftp://172.18.104.79:21/upload/";
|
||||
private final String FILE_PATH = "/mnt/sdcard/Download/group_test_3/战斗吧剑灵.apk";
|
||||
private final String URL = "ftp://172.18.104.66:21/upload/";
|
||||
|
||||
@Override protected void init(Bundle savedInstanceState) {
|
||||
setTile("FTP 文件上传");
|
||||
@ -99,6 +99,6 @@ public class FtpUploadActivity extends BaseActivity<ActivityFtpUploadBinding> {
|
||||
@Upload.onTaskComplete public void taskComplete(UploadTask task) {
|
||||
getBinding().setProgress(100);
|
||||
getBinding().setSpeed("");
|
||||
T.showShort(this, "上传完成");
|
||||
T.showShort(this, "文件:" + task.getEntity().getFileName() + ",上传完成");
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user