添加onWait注解,修复自动添加等待任务的bug
This commit is contained in:
@@ -27,6 +27,7 @@ import com.arialyy.aria.core.manager.TEManager;
|
||||
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.scheduler.ISchedulers;
|
||||
import com.arialyy.aria.core.upload.UploadTaskEntity;
|
||||
import com.arialyy.aria.util.ALog;
|
||||
import com.arialyy.aria.util.CommonUtil;
|
||||
@@ -79,6 +80,15 @@ public abstract class AbsNormalCmd<T extends AbsTaskEntity> extends AbsCmd<T> {
|
||||
isDownloadCmd = taskType < ICmd.TASK_TYPE_UPLOAD;
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送等待状态
|
||||
*/
|
||||
void sendWaitState() {
|
||||
if (tempTask != null) {
|
||||
tempTask.getOutHandler().obtainMessage(ISchedulers.WAIT, tempTask).sendToTarget();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除所有任务
|
||||
*/
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
package com.arialyy.aria.core.command.normal;
|
||||
|
||||
import com.arialyy.aria.core.inf.AbsTask;
|
||||
import com.arialyy.aria.core.inf.IEntity;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
import com.arialyy.aria.core.inf.IEntity;
|
||||
import com.arialyy.aria.util.ALog;
|
||||
|
||||
/**
|
||||
@@ -37,6 +37,7 @@ class AddCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
if (task == null) {
|
||||
mTaskEntity.getEntity().setState(IEntity.STATE_WAIT);
|
||||
createTask();
|
||||
sendWaitState();
|
||||
} else {
|
||||
ALog.w(TAG, "添加命令执行失败,【该任务已经存在】");
|
||||
}
|
||||
|
||||
@@ -79,6 +79,8 @@ class StartCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
|| task.getState() == IEntity.STATE_COMPLETE) {
|
||||
//startTask();
|
||||
resumeTask();
|
||||
} else {
|
||||
sendWaitState();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -141,6 +143,8 @@ class StartCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
private void handleTask(List<AbsTaskEntity> waitList) {
|
||||
for (AbsTaskEntity te : waitList) {
|
||||
if (te.getEntity() == null) continue;
|
||||
AbsTask task = getTask(te.getEntity());
|
||||
if (task != null) continue;
|
||||
if (te instanceof DownloadTaskEntity) {
|
||||
if (te.requestType == AbsTaskEntity.D_FTP || te.requestType == AbsTaskEntity.U_FTP) {
|
||||
te.urlEntity = CommonUtil.getFtpUrlInfo(te.getEntity().getKey());
|
||||
@@ -152,6 +156,7 @@ class StartCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
mQueue = DownloadGroupTaskQueue.getInstance();
|
||||
}
|
||||
createTask(te);
|
||||
sendWaitState();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import java.lang.ref.WeakReference;
|
||||
*/
|
||||
class BaseDListener<ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskEntity<ENTITY>, TASK extends AbsTask<TASK_ENTITY>>
|
||||
implements IDownloadListener {
|
||||
private static final String TAG = "BaseDListener";
|
||||
protected WeakReference<Handler> outHandler;
|
||||
private int RUN_SAVE_INTERVAL = 5 * 1000; //5s保存一次下载中的进度
|
||||
private long mLastLen = 0; //上一次发送长度
|
||||
|
||||
@@ -17,6 +17,7 @@ package com.arialyy.aria.core.download;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.arialyy.aria.core.AriaManager;
|
||||
import com.arialyy.aria.core.download.downloader.DownloadGroupUtil;
|
||||
@@ -81,6 +82,11 @@ public class DownloadGroupTask extends AbsGroupTask<DownloadGroupTaskEntity> {
|
||||
mUtil.cancel();
|
||||
}
|
||||
|
||||
@Override public String getTaskName() {
|
||||
return "任务组->" + (TextUtils.isEmpty(mTaskEntity.getEntity().getAlias())
|
||||
? mTaskEntity.getEntity().getGroupName() : mTaskEntity.getEntity().getAlias());
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
DownloadGroupTaskEntity taskEntity;
|
||||
Handler outHandler;
|
||||
|
||||
@@ -148,6 +148,10 @@ public class DownloadTask extends AbsNormalTask<DownloadTaskEntity> {
|
||||
mUtil.cancel();
|
||||
}
|
||||
|
||||
@Override public String getTaskName() {
|
||||
return mEntity.getFileName();
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
DownloadTaskEntity taskEntity;
|
||||
Handler outHandler;
|
||||
|
||||
@@ -38,6 +38,10 @@ public abstract class AbsTask<TASK_ENTITY extends AbsTaskEntity> implements ITas
|
||||
protected Context mContext;
|
||||
protected boolean isHeighestTask = false;
|
||||
|
||||
public Handler getOutHandler() {
|
||||
return mOutHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* 任务是否完成
|
||||
*
|
||||
@@ -163,6 +167,11 @@ public abstract class AbsTask<TASK_ENTITY extends AbsTaskEntity> implements ITas
|
||||
return mTaskEntity;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取任务名,也就是文件名
|
||||
*/
|
||||
public abstract String getTaskName();
|
||||
|
||||
public String getTargetName() {
|
||||
return mTargetName;
|
||||
}
|
||||
|
||||
@@ -163,6 +163,19 @@ public class TEManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新任务实体
|
||||
*/
|
||||
public void putTEntity(String key, AbsTaskEntity tEntity) {
|
||||
final Lock lock = this.lock;
|
||||
lock.lock();
|
||||
try {
|
||||
cache.put(convertKey(key), tEntity);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 向管理器中增加任务实体
|
||||
*
|
||||
|
||||
@@ -63,7 +63,7 @@ abstract class AbsTaskQueue<TASK extends AbsTask, TASK_ENTITY extends AbsTaskEnt
|
||||
* 如果执行队列任务未满,则直接启动任务。
|
||||
* 如果执行队列已经满了,则暂停执行队列队首任务,并恢复指定任务
|
||||
*
|
||||
* @param task 需要恢复飞任务
|
||||
* @param task 需要恢复的任务
|
||||
*/
|
||||
@Override public void resumeTask(TASK task) {
|
||||
if (mExecutePool.size() >= getMaxTaskNum()) {
|
||||
@@ -167,12 +167,12 @@ abstract class AbsTaskQueue<TASK extends AbsTask, TASK_ENTITY extends AbsTaskEnt
|
||||
}
|
||||
|
||||
@Override public void stopTask(TASK task) {
|
||||
if (!task.isRunning()) ALog.w(TAG, "停止任务失败,【任务已经停止】");
|
||||
if (!task.isRunning()) ALog.w(TAG, "停止任务【" + task.getTaskName() + "】失败,原因:已停止");
|
||||
if (mExecutePool.removeTask(task)) {
|
||||
task.stop();
|
||||
} else {
|
||||
task.stop();
|
||||
ALog.w(TAG, "删除任务失败,【执行队列中没有该任务】");
|
||||
ALog.w(TAG, "删除任务【" + task.getTaskName() + "】失败,原因:执行队列中没有该任务");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,27 +180,29 @@ abstract class AbsTaskQueue<TASK extends AbsTask, TASK_ENTITY extends AbsTaskEnt
|
||||
//TEManager.getInstance().removeTEntity(key);
|
||||
TASK task = mExecutePool.getTask(key);
|
||||
if (task != null) {
|
||||
ALog.d(TAG, "从执行池删除任务,删除" + (mExecutePool.removeTask(task) ? "成功" : "失败"));
|
||||
ALog.d(TAG,
|
||||
"从执行池删除任务【" + task.getTaskName() + "】" + (mExecutePool.removeTask(task) ? "成功" : "失败"));
|
||||
}
|
||||
task = mCachePool.getTask(key);
|
||||
if (task != null) {
|
||||
ALog.d(TAG, "从缓存池删除任务,删除" + (mCachePool.removeTask(task) ? "成功" : "失败"));
|
||||
ALog.d(TAG,
|
||||
"从缓存池删除任务【" + task.getTaskName() + "】" + (mCachePool.removeTask(task) ? "成功" : "失败"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void reTryStart(TASK task) {
|
||||
if (task == null) {
|
||||
ALog.e(TAG, "重试失败,task 为null");
|
||||
ALog.e(TAG, "任务重试失败,原因:task 为null");
|
||||
return;
|
||||
}
|
||||
if (!NetUtils.isConnected(AriaManager.APP)) {
|
||||
ALog.e(TAG, "重试失败,网络未连接");
|
||||
ALog.e(TAG, "任务【" + task.getTaskName() + "】重试失败,原因:网络未连接");
|
||||
return;
|
||||
}
|
||||
if (!task.isRunning()) {
|
||||
task.start();
|
||||
} else {
|
||||
ALog.e(TAG, "任务没有完全停止,重试下载失败");
|
||||
ALog.e(TAG, "任务【" + task.getTaskName() + "】重试失败,原因:任务没有完全停止,");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -63,10 +63,15 @@ public class DownloadGroupTaskQueue
|
||||
@Override public DownloadGroupTask createTask(String targetName, DownloadGroupTaskEntity entity) {
|
||||
DownloadGroupTask task = null;
|
||||
if (!TextUtils.isEmpty(targetName)) {
|
||||
task = (DownloadGroupTask) TaskFactory.getInstance()
|
||||
.createTask(targetName, entity, DownloadGroupSchedulers.getInstance());
|
||||
entity.key = entity.getEntity().getGroupName();
|
||||
mCachePool.putTask(task);
|
||||
if (mCachePool.getTask(entity.getEntity().getKey()) == null
|
||||
&& mExecutePool.getTask(entity.getEntity().getKey()) == null) {
|
||||
task = (DownloadGroupTask) TaskFactory.getInstance()
|
||||
.createTask(targetName, entity, DownloadGroupSchedulers.getInstance());
|
||||
entity.key = entity.getEntity().getGroupName();
|
||||
mCachePool.putTask(task);
|
||||
} else {
|
||||
ALog.w(TAG, "任务已存在");
|
||||
}
|
||||
} else {
|
||||
ALog.e(TAG, "target name 为 null!!");
|
||||
}
|
||||
|
||||
@@ -33,8 +33,7 @@ import java.util.Set;
|
||||
* Created by lyy on 2016/8/17.
|
||||
* 下载任务队列
|
||||
*/
|
||||
public class DownloadTaskQueue
|
||||
extends AbsTaskQueue<DownloadTask, DownloadTaskEntity> {
|
||||
public class DownloadTaskQueue extends AbsTaskQueue<DownloadTask, DownloadTaskEntity> {
|
||||
private static final String TAG = "DownloadTaskQueue";
|
||||
private static volatile DownloadTaskQueue INSTANCE = null;
|
||||
|
||||
@@ -120,10 +119,15 @@ public class DownloadTaskQueue
|
||||
@Override public DownloadTask createTask(String target, DownloadTaskEntity entity) {
|
||||
DownloadTask task = null;
|
||||
if (!TextUtils.isEmpty(target)) {
|
||||
task = (DownloadTask) TaskFactory.getInstance()
|
||||
.createTask(target, entity, DownloadSchedulers.getInstance());
|
||||
entity.key = entity.getEntity().getDownloadPath();
|
||||
mCachePool.putTask(task);
|
||||
if (mCachePool.getTask(entity.getEntity().getKey()) == null
|
||||
&& mExecutePool.getTask(entity.getEntity().getKey()) == null) {
|
||||
task = (DownloadTask) TaskFactory.getInstance()
|
||||
.createTask(target, entity, DownloadSchedulers.getInstance());
|
||||
entity.key = entity.getEntity().getDownloadPath();
|
||||
mCachePool.putTask(task);
|
||||
} else {
|
||||
ALog.w(TAG, "任务已存在");
|
||||
}
|
||||
} else {
|
||||
ALog.e(TAG, "target name 为 null!!");
|
||||
}
|
||||
|
||||
@@ -1,120 +0,0 @@
|
||||
/*
|
||||
* 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).getKey()))
|
||||
.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.cancelTask((AbsTask) msg.obj);
|
||||
break;
|
||||
case CMD_STOP_ALL_TASK:
|
||||
queue.stopAllTask();
|
||||
break;
|
||||
case CMD_CANCEL_ALL_TASK:
|
||||
queue.removeAllTask();
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -65,10 +65,15 @@ public class UploadTaskQueue extends AbsTaskQueue<UploadTask, UploadTaskEntity>
|
||||
@Override public UploadTask createTask(String targetName, UploadTaskEntity entity) {
|
||||
UploadTask task = null;
|
||||
if (!TextUtils.isEmpty(targetName)) {
|
||||
task = (UploadTask) TaskFactory.getInstance()
|
||||
.createTask(targetName, entity, UploadSchedulers.getInstance());
|
||||
entity.key = entity.getEntity().getFilePath();
|
||||
mCachePool.putTask(task);
|
||||
if (mCachePool.getTask(entity.getEntity().getKey()) == null
|
||||
&& mExecutePool.getTask(entity.getEntity().getKey()) == null) {
|
||||
task = (UploadTask) TaskFactory.getInstance()
|
||||
.createTask(targetName, entity, UploadSchedulers.getInstance());
|
||||
entity.key = entity.getEntity().getFilePath();
|
||||
mCachePool.putTask(task);
|
||||
} else {
|
||||
ALog.w(TAG, "任务已存在");
|
||||
}
|
||||
} else {
|
||||
ALog.e(TAG, "target name 为 null是!!");
|
||||
}
|
||||
|
||||
@@ -54,8 +54,8 @@ public class BaseCachePool<TASK extends AbsTask> implements IPool<TASK> {
|
||||
/**
|
||||
* 清除所有缓存的任务
|
||||
*/
|
||||
public void clear(){
|
||||
for (String key : mCacheMap.keySet()){
|
||||
public void clear() {
|
||||
for (String key : mCacheMap.keySet()) {
|
||||
TASK task = mCacheMap.get(key);
|
||||
mCacheQueue.remove(task);
|
||||
mCacheMap.remove(key);
|
||||
@@ -85,16 +85,16 @@ public class BaseCachePool<TASK extends AbsTask> implements IPool<TASK> {
|
||||
@Override public boolean putTask(TASK task) {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
if (task == null) {
|
||||
ALog.e(TAG, "下载任务不能为空!!");
|
||||
ALog.e(TAG, "任务不能为空!!");
|
||||
return false;
|
||||
}
|
||||
String url = task.getKey();
|
||||
if (mCacheQueue.contains(task)) {
|
||||
ALog.w(TAG, "队列中已经包含了该任务,任务下载链接【" + url + "】");
|
||||
ALog.w(TAG, "任务【" + task.getTaskName() + "】进入缓存队列失败,原因:已经在缓存队列中");
|
||||
return false;
|
||||
} else {
|
||||
boolean s = mCacheQueue.offer(task);
|
||||
ALog.d(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】"));
|
||||
ALog.d(TAG, "任务【" + task.getTaskName() + "】进入缓存队列" + (s ? "成功" : "失败"));
|
||||
if (s) {
|
||||
mCacheMap.put(CommonUtil.keyToHashKey(url), task);
|
||||
}
|
||||
@@ -120,14 +120,13 @@ public class BaseCachePool<TASK extends AbsTask> implements IPool<TASK> {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override public TASK getTask(String downloadUrl) {
|
||||
@Override public TASK getTask(String key) {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
if (TextUtils.isEmpty(downloadUrl)) {
|
||||
ALog.e(TAG, "请传入有效的下载链接");
|
||||
if (TextUtils.isEmpty(key)) {
|
||||
ALog.e(TAG, "key 为null");
|
||||
return null;
|
||||
}
|
||||
String key = CommonUtil.keyToHashKey(downloadUrl);
|
||||
return mCacheMap.get(key);
|
||||
return mCacheMap.get(CommonUtil.keyToHashKey(key));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,15 +143,15 @@ public class BaseCachePool<TASK extends AbsTask> implements IPool<TASK> {
|
||||
}
|
||||
}
|
||||
|
||||
@Override public boolean removeTask(String downloadUrl) {
|
||||
@Override public boolean removeTask(String key) {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
if (TextUtils.isEmpty(downloadUrl)) {
|
||||
if (TextUtils.isEmpty(key)) {
|
||||
ALog.e(TAG, "请传入有效的下载链接");
|
||||
return false;
|
||||
}
|
||||
String key = CommonUtil.keyToHashKey(downloadUrl);
|
||||
TASK task = mCacheMap.get(key);
|
||||
mCacheMap.remove(key);
|
||||
String temp = CommonUtil.keyToHashKey(key);
|
||||
TASK task = mCacheMap.get(temp);
|
||||
mCacheMap.remove(temp);
|
||||
return mCacheQueue.remove(task);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,9 +65,8 @@ public class BaseExecutePool<TASK extends AbsTask> implements IPool<TASK> {
|
||||
ALog.e(TAG, "任务不能为空!!");
|
||||
return false;
|
||||
}
|
||||
String url = task.getKey();
|
||||
if (mExecuteQueue.contains(task)) {
|
||||
ALog.e(TAG, "队列中已经包含了该任务,任务key【" + url + "】");
|
||||
ALog.e(TAG, "任务【" + task.getTaskName() + "】进入执行队列失败,原因:已经在执行队列中");
|
||||
return false;
|
||||
} else {
|
||||
if (mExecuteQueue.size() >= mSize) {
|
||||
@@ -112,7 +111,7 @@ public class BaseExecutePool<TASK extends AbsTask> implements IPool<TASK> {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
String url = newTask.getKey();
|
||||
boolean s = mExecuteQueue.offer(newTask);
|
||||
ALog.d(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】"));
|
||||
ALog.d(TAG, "任务【" + newTask.getTaskName() + "】进入执行队列" + (s ? "成功" : "失败"));
|
||||
if (s) {
|
||||
mExecuteMap.put(CommonUtil.keyToHashKey(url), newTask);
|
||||
}
|
||||
@@ -128,7 +127,7 @@ public class BaseExecutePool<TASK extends AbsTask> implements IPool<TASK> {
|
||||
try {
|
||||
TASK oldTask = mExecuteQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
|
||||
if (oldTask == null) {
|
||||
ALog.w(TAG, "移除任务失败");
|
||||
ALog.w(TAG, "移除任务失败,原因:任务为null");
|
||||
return false;
|
||||
}
|
||||
oldTask.stop();
|
||||
@@ -162,7 +161,7 @@ public class BaseExecutePool<TASK extends AbsTask> implements IPool<TASK> {
|
||||
@Override public TASK getTask(String key) {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
if (TextUtils.isEmpty(key)) {
|
||||
ALog.e(TAG, "请传入有效的任务key");
|
||||
ALog.e(TAG, "key 为null");
|
||||
return null;
|
||||
}
|
||||
return mExecuteMap.get(CommonUtil.keyToHashKey(key));
|
||||
@@ -183,7 +182,7 @@ public class BaseExecutePool<TASK extends AbsTask> implements IPool<TASK> {
|
||||
@Override public boolean removeTask(String key) {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
if (TextUtils.isEmpty(key)) {
|
||||
ALog.e(TAG, "请传入有效的任务key");
|
||||
ALog.e(TAG, "key 为null");
|
||||
return false;
|
||||
}
|
||||
String convertKey = CommonUtil.keyToHashKey(key);
|
||||
|
||||
@@ -39,10 +39,9 @@ class DownloadExecutePool<TASK extends AbsTask> extends BaseExecutePool<TASK> {
|
||||
ALog.e(TAG, "任务不能为空!!");
|
||||
return false;
|
||||
}
|
||||
String url = task.getKey();
|
||||
if (mExecuteQueue.contains(task)) {
|
||||
if (!task.isRunning()) return true;
|
||||
ALog.e(TAG, "队列中已经包含了该任务,任务key【" + url + "】");
|
||||
ALog.e(TAG, "任务【" + task.getTaskName() + "】进入执行队列失败,错误原因:已经在执行队列中");
|
||||
return false;
|
||||
} else {
|
||||
if (mExecuteQueue.size() >= mSize) {
|
||||
@@ -65,7 +64,7 @@ class DownloadExecutePool<TASK extends AbsTask> extends BaseExecutePool<TASK> {
|
||||
try {
|
||||
TASK oldTask = mExecuteQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
|
||||
if (oldTask == null) {
|
||||
ALog.e(TAG, "移除任务失败");
|
||||
ALog.w(TAG, "移除任务失败,错误原因:任务为null");
|
||||
return false;
|
||||
}
|
||||
if (oldTask.isHighestPriorityTask()) {
|
||||
|
||||
@@ -21,7 +21,12 @@ import com.arialyy.aria.core.inf.ITask;
|
||||
/**
|
||||
* Created by Aria.Lao on 2017/6/7.
|
||||
*/
|
||||
public class AbsSchedulerListener<TASK extends ITask, SUB_ENTITY extends AbsNormalEntity> implements ISchedulerListener<TASK> {
|
||||
public class AbsSchedulerListener<TASK extends ITask, SUB_ENTITY extends AbsNormalEntity>
|
||||
implements ISchedulerListener<TASK> {
|
||||
|
||||
@Override public void onWait(TASK task) {
|
||||
|
||||
}
|
||||
|
||||
@Override public void onPre(TASK task) {
|
||||
|
||||
|
||||
@@ -175,6 +175,8 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, TASK extends Abs
|
||||
}
|
||||
if (what == CANCEL || what == COMPLETE) {
|
||||
TEManager.getInstance().removeTEntity(task.getKey());
|
||||
} else {
|
||||
TEManager.getInstance().putTEntity(task.getKey(), task.getTaskEntity());
|
||||
}
|
||||
callback(what, task);
|
||||
}
|
||||
@@ -201,6 +203,9 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, TASK extends Abs
|
||||
return;
|
||||
}
|
||||
switch (state) {
|
||||
case WAIT:
|
||||
listener.onWait(task);
|
||||
break;
|
||||
case PRE:
|
||||
listener.onPre(task);
|
||||
break;
|
||||
|
||||
@@ -21,6 +21,12 @@ import com.arialyy.aria.core.inf.ITask;
|
||||
* Target处理任务监听
|
||||
*/
|
||||
public interface ISchedulerListener<TASK extends ITask> {
|
||||
|
||||
/**
|
||||
* 队列已经满了,继续创建任务,将会回调该方法
|
||||
*/
|
||||
void onWait(TASK task);
|
||||
|
||||
/**
|
||||
* 预处理,有时有些地址链接比较慢,这时可以先在这个地方出来一些界面上的UI,如按钮的状态。
|
||||
* 在这个回调中,任务是获取不到文件大小,下载速度等参数
|
||||
@@ -66,8 +72,4 @@ public interface ISchedulerListener<TASK extends ITask> {
|
||||
* 任务执行中
|
||||
*/
|
||||
void onTaskRunning(TASK task);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -70,6 +70,10 @@ public interface ISchedulers<Task extends AbsTask> extends Handler.Callback {
|
||||
* 恢复任务
|
||||
*/
|
||||
int RESUME = 8;
|
||||
/**
|
||||
* 等待
|
||||
*/
|
||||
int WAIT = 10;
|
||||
|
||||
/**
|
||||
* 任务组子任务预处理
|
||||
|
||||
@@ -17,6 +17,8 @@ package com.arialyy.aria.core.upload;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
import android.text.TextUtils;
|
||||
import com.arialyy.aria.core.AriaManager;
|
||||
import com.arialyy.aria.core.command.normal.NormalCmdFactory;
|
||||
import com.arialyy.aria.core.inf.AbsTaskEntity;
|
||||
import com.arialyy.aria.core.inf.AbsUploadTarget;
|
||||
import com.arialyy.aria.core.manager.TEManager;
|
||||
@@ -97,4 +99,14 @@ public class FtpUploadTarget
|
||||
mTaskEntity.urlEntity.account = account;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加任务
|
||||
*/
|
||||
public void add() {
|
||||
AriaManager.getInstance(AriaManager.APP)
|
||||
.setCmd(CommonUtil.createNormalCmd(mTargetName, mTaskEntity, NormalCmdFactory.TASK_CREATE,
|
||||
checkTaskType()))
|
||||
.exe();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.database.sqlite.SQLiteOpenHelper;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.util.LruCache;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import com.arialyy.aria.core.AriaManager;
|
||||
import com.arialyy.aria.util.ALog;
|
||||
import com.arialyy.aria.util.CheckUtil;
|
||||
@@ -31,9 +32,11 @@ import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* Created by lyy on 2015/11/2.
|
||||
@@ -50,7 +53,8 @@ final class SqlHelper extends SQLiteOpenHelper {
|
||||
private static final int DEL_DATA = 6;
|
||||
|
||||
private static volatile SqlHelper INSTANCE = null;
|
||||
private static LruCache<Integer, DbEntity> mDataCache = new LruCache<>(1024);
|
||||
private static LruCache<String, DbEntity> mDataCache = new LruCache<>(1024);
|
||||
//private static Map<String, DbEntity> mDataCache = new ConcurrentHashMap<>();
|
||||
|
||||
static SqlHelper init(Context context) {
|
||||
if (INSTANCE == null) {
|
||||
@@ -330,7 +334,7 @@ final class SqlHelper extends SQLiteOpenHelper {
|
||||
db = checkDb(db);
|
||||
Class<?> clazz = dbEntity.getClass();
|
||||
List<Field> fields = CommonUtil.getAllFields(clazz);
|
||||
DbEntity cacheEntity = mDataCache.get(dbEntity.hashCode());
|
||||
DbEntity cacheEntity = mDataCache.get(getCacheKey(dbEntity));
|
||||
if (fields != null && fields.size() > 0) {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
StringBuilder prams = new StringBuilder();
|
||||
@@ -342,7 +346,15 @@ final class SqlHelper extends SQLiteOpenHelper {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
if (cacheEntity != null && field.get(dbEntity) == field.get(cacheEntity)) {
|
||||
if (cacheEntity != null
|
||||
&& field.get(dbEntity) == field.get(cacheEntity)
|
||||
&& !field.getName().equals("state")) { //在LruCache中 state字段总是不能重新赋值...
|
||||
//if (dbEntity instanceof DownloadEntity && field.getName().equals("state")) {
|
||||
// Log.i(TAG, "cacheState => "
|
||||
// + ((DownloadEntity) cacheEntity).getState()
|
||||
// + ", newState => "
|
||||
// + ((DownloadEntity) dbEntity).getState());
|
||||
//}
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -383,9 +395,14 @@ final class SqlHelper extends SQLiteOpenHelper {
|
||||
db.execSQL(sql.toString());
|
||||
}
|
||||
}
|
||||
mDataCache.put(getCacheKey(dbEntity), dbEntity);
|
||||
close(db);
|
||||
}
|
||||
|
||||
private static String getCacheKey(DbEntity dbEntity) {
|
||||
return dbEntity.getClass().getName() + "_" + dbEntity.rowID;
|
||||
}
|
||||
|
||||
/**
|
||||
* 插入数据
|
||||
*/
|
||||
@@ -673,7 +690,7 @@ final class SqlHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
}
|
||||
entity.rowID = cursor.getInt(cursor.getColumnIndex("rowid"));
|
||||
mDataCache.put(entity.hashCode(), entity);
|
||||
mDataCache.put(getCacheKey(entity), entity);
|
||||
entitys.add(entity);
|
||||
}
|
||||
closeCursor(cursor);
|
||||
|
||||
Reference in New Issue
Block a user