添加onWait注解,修复自动添加等待任务的bug

This commit is contained in:
e
2018-01-31 19:52:51 +08:00
parent b191bb2470
commit 1f3bd90b3b
37 changed files with 255 additions and 214 deletions

View File

@@ -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();
}
}
/**
* 删除所有任务
*/

View File

@@ -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, "添加命令执行失败,【该任务已经存在】");
}

View File

@@ -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();
}
}
}

View File

@@ -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; //上一次发送长度

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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();
}
}
/**
* 向管理器中增加任务实体
*

View File

@@ -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() + "】重试失败,原因:任务没有完全停止,");
}
}

View File

@@ -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");
}

View File

@@ -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");
}

View File

@@ -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;
}
}

View File

@@ -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是");
}

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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()) {

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -70,6 +70,10 @@ public interface ISchedulers<Task extends AbsTask> extends Handler.Callback {
* 恢复任务
*/
int RESUME = 8;
/**
* 等待
*/
int WAIT = 10;
/**
* 任务组子任务预处理

View File

@@ -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();
}
}

View File

@@ -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);