Merge branch 'v_3.0'

This commit is contained in:
AriaLyy
2017-05-16 11:07:29 +08:00
30 changed files with 313 additions and 169 deletions

View File

@ -7,8 +7,8 @@ android {
defaultConfig { defaultConfig {
minSdkVersion 9 minSdkVersion 9
targetSdkVersion 23 targetSdkVersion 23
versionCode 101 versionCode 102
versionName "3.0.2" versionName "3.0.3"
} }
buildTypes { buildTypes {
release { release {

View File

@ -28,17 +28,14 @@ import android.support.v4.app.Fragment;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.widget.PopupWindow; import android.widget.PopupWindow;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.download.DownloadReceiver; import com.arialyy.aria.core.download.DownloadReceiver;
import com.arialyy.aria.core.inf.ICmd; import com.arialyy.aria.core.inf.ICmd;
import com.arialyy.aria.core.inf.IReceiver; import com.arialyy.aria.core.inf.IReceiver;
import com.arialyy.aria.core.queue.DownloadTaskQueue; import com.arialyy.aria.core.queue.DownloadTaskQueue;
import com.arialyy.aria.core.queue.UploadTaskQueue;
import com.arialyy.aria.core.upload.UploadReceiver; import com.arialyy.aria.core.upload.UploadReceiver;
import com.arialyy.aria.orm.DbEntity;
import com.arialyy.aria.orm.DbUtil; import com.arialyy.aria.orm.DbUtil;
import com.arialyy.aria.util.CAConfiguration; import com.arialyy.aria.util.CAConfiguration;
import com.arialyy.aria.util.Configuration; import com.arialyy.aria.util.Configuration_1;
import com.arialyy.aria.util.Speed; import com.arialyy.aria.util.Speed;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -60,6 +57,7 @@ import java.util.Map;
private Map<String, IReceiver> mReceivers = new HashMap<>(); private Map<String, IReceiver> mReceivers = new HashMap<>();
public static Context APP; public static Context APP;
private List<ICmd> mCommands = new ArrayList<>(); private List<ICmd> mCommands = new ArrayList<>();
private Configuration mConfig;
private AriaManager(Context context) { private AriaManager(Context context) {
DbUtil.init(context.getApplicationContext()); DbUtil.init(context.getApplicationContext());
@ -84,7 +82,7 @@ import java.util.Map;
* 设置最大下载速度 * 设置最大下载速度
*/ */
public void setMaxSpeed(Speed speed) { public void setMaxSpeed(Speed speed) {
Configuration.getInstance().setMaxSpeed(speed); Configuration_1.getInstance().setMaxSpeed(speed);
} }
/** /**
@ -159,7 +157,7 @@ import java.util.Map;
* 设置下载超时时间 * 设置下载超时时间
*/ */
@Deprecated private AriaManager setTimeOut(int timeOut) { @Deprecated private AriaManager setTimeOut(int timeOut) {
Configuration.getInstance().setTimeOut(timeOut); Configuration_1.getInstance().setTimeOut(timeOut);
return this; return this;
} }
@ -167,7 +165,7 @@ import java.util.Map;
* 设置失败重试次数 * 设置失败重试次数
*/ */
public AriaManager setReTryNum(int reTryNum) { public AriaManager setReTryNum(int reTryNum) {
Configuration.getInstance().setReTryNum(reTryNum); Configuration_1.getInstance().setReTryNum(reTryNum);
return this; return this;
} }
@ -175,7 +173,7 @@ import java.util.Map;
* 设置失败重试间隔 * 设置失败重试间隔
*/ */
public AriaManager setReTryInterval(int interval) { public AriaManager setReTryInterval(int interval) {
Configuration.getInstance().setReTryInterval(interval); Configuration_1.getInstance().setReTryInterval(interval);
return this; return this;
} }
@ -183,7 +181,7 @@ import java.util.Map;
* 是否打开下载广播 * 是否打开下载广播
*/ */
public AriaManager openBroadcast(boolean open) { public AriaManager openBroadcast(boolean open) {
Configuration.getInstance().setOpenBroadcast(open); Configuration_1.getInstance().setOpenBroadcast(open);
return this; return this;
} }

View File

@ -0,0 +1,78 @@
/*
* 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;
/**
* Created by AriaL on 2016/12/8.
* 信息配置
*/
class Configuration {
private static final String TAG = "Configuration";
private static final String CONFIG_FILE = "/Aria/ADConfig.properties";
private static final String CONFIG_KEY = "ARIA_CONFIG";
/**
* 通用配置
*/
static class BaseConfig {
public boolean isOpenBreadCast = false;
/**
* 任务队列最大任务数, 默认为2
*/
public int maxQueueNum = 2;
/**
* 下载失败重试次数默认为10
*/
public int reTryNum = 10;
/**
* 设置重试间隔单位为毫秒默认2000毫秒
*/
public long reTryInterval = 2000;
/**
* 设置url连接超时时间单位为毫秒默认5000毫秒
*/
public long connectTimeOut = 5000;
}
/**
* 下载配置
*/
public static class DownloadConfig extends BaseConfig {
/**
* 设置IO流读取时间单位为毫秒默认20000毫秒该时间不能少于10000毫秒
*/
public long readTimeout = 20 * 1000;
/**
* 设置写文件buff大小该数值大小不能小于2048数值变小下载速度会变慢
*/
public int buffSize = 8192;
/**
* 设置https ca 证书信息path 为assets目录下的CA证书完整路径
*/
public String caPath;
/**
* name 为CA证书名
*/
public String caName;
}
/**
* 上传配置
*/
public static class UploadConfig extends BaseConfig {
}
}

View File

@ -35,12 +35,17 @@ public abstract class AbsCmd<T extends ITaskEntity> implements ICmd {
T mEntity; T mEntity;
String TAG; String TAG;
String mTargetName; String mTargetName;
/**
* 能否执行命令
*/
boolean cancelExe = true;
/** /**
* @param targetName 产生任务的对象名 * @param targetName 产生任务的对象名
*/ */
AbsCmd(String targetName, T entity) { AbsCmd(String targetName, T entity) {
CheckUtil.checkCmdEntity(entity); cancelExe = CheckUtil.checkCmdEntity(entity,
!(this instanceof CancelCmd) || !(this instanceof StopCmd));
mTargetName = targetName; mTargetName = targetName;
mEntity = entity; mEntity = entity;
TAG = CommonUtil.getClassName(this); TAG = CommonUtil.getClassName(this);

View File

@ -31,6 +31,7 @@ class AddCmd<T extends ITaskEntity> extends AbsCmd<T> {
} }
@Override public void executeCmd() { @Override public void executeCmd() {
if (!cancelExe) return;
ITask task = mQueue.getTask(mEntity.getEntity()); ITask task = mQueue.getTask(mEntity.getEntity());
if (task == null) { if (task == null) {
mQueue.createTask(mTargetName, mEntity); mQueue.createTask(mTargetName, mEntity);
@ -39,20 +40,4 @@ class AddCmd<T extends ITaskEntity> extends AbsCmd<T> {
} }
} }
//AddCmd(DownloadTaskEntity entity) {
// super(entity);
//}
//
//AddCmd(String targetName, DownloadTaskEntity entity) {
// super(targetName, entity);
//}
//
//@Override public void executeCmd() {
// DownloadTask task = mQueue.getTask(mEntity.downloadEntity);
// if (task == null) {
// mQueue.createTask(mTargetName, mEntity);
// } else {
// Log.w(TAG, "添加命令执行失败,【该任务已经存在】");
// }
//}
} }

View File

@ -29,6 +29,7 @@ class CancelCmd<T extends ITaskEntity> extends AbsCmd<T> {
} }
@Override public void executeCmd() { @Override public void executeCmd() {
if (!cancelExe) return;
ITask task = mQueue.getTask(mEntity.getEntity()); ITask task = mQueue.getTask(mEntity.getEntity());
if (task == null) { if (task == null) {
task = mQueue.createTask(mTargetName, mEntity); task = mQueue.createTask(mTargetName, mEntity);
@ -40,25 +41,4 @@ class CancelCmd<T extends ITaskEntity> extends AbsCmd<T> {
mQueue.cancelTask(task); mQueue.cancelTask(task);
} }
} }
//CancelCmd(DownloadTaskEntity entity) {
// super(entity);
//}
//
//CancelCmd(String targetName, DownloadTaskEntity entity) {
// super(targetName, entity);
//}
//
//@Override public void executeCmd() {
// DownloadTask task = mQueue.getTask(mEntity.downloadEntity);
// if (task == null) {
// task = mQueue.createTask(mTargetName, mEntity);
// }
// if (task != null) {
// if (mTargetName != null) {
// task.setTargetName(mTargetName);
// }
// mQueue.cancelTask(task);
// }
//}
} }

View File

@ -31,6 +31,7 @@ class StartCmd<T extends ITaskEntity> extends AbsCmd<T> {
} }
@Override public void executeCmd() { @Override public void executeCmd() {
if (!cancelExe) return;
ITask task = mQueue.getTask(mEntity.getEntity()); ITask task = mQueue.getTask(mEntity.getEntity());
if (task == null) { if (task == null) {
task = mQueue.createTask(mTargetName, mEntity); task = mQueue.createTask(mTargetName, mEntity);
@ -41,22 +42,4 @@ class StartCmd<T extends ITaskEntity> extends AbsCmd<T> {
} }
} }
//StartCmd(DownloadTaskEntity entity) {
// super(entity);
//}
//
//StartCmd(String targetName, DownloadTaskEntity entity) {
// super(targetName, entity);
//}
//
//@Override public void executeCmd() {
// DownloadTask task = mQueue.getTask(mEntity.downloadEntity);
// if (task == null) {
// task = mQueue.createTask(mTargetName, mEntity);
// }
// if (task != null) {
// task.setTargetName(mTargetName);
// mQueue.startTask(task);
// }
//}
} }

View File

@ -33,6 +33,7 @@ class StopCmd<T extends ITaskEntity> extends AbsCmd<T> {
} }
@Override public void executeCmd() { @Override public void executeCmd() {
if (!cancelExe) return;
ITask task = mQueue.getTask(mEntity.getEntity()); ITask task = mQueue.getTask(mEntity.getEntity());
if (task == null) { if (task == null) {
if (mEntity.getEntity().getState() == IEntity.STATE_RUNNING) { if (mEntity.getEntity().getState() == IEntity.STATE_RUNNING) {
@ -48,29 +49,4 @@ class StopCmd<T extends ITaskEntity> extends AbsCmd<T> {
mQueue.stopTask(task); mQueue.stopTask(task);
} }
} }
//StopCmd(DownloadTaskEntity entity) {
// super(entity);
//}
//
//StopCmd(String targetName, DownloadTaskEntity entity) {
// super(targetName, entity);
//}
//
//@Override public void executeCmd() {
// DownloadTask task = mQueue.getTask(mEntity.downloadEntity);
// if (task == null) {
// if (mEntity.downloadEntity.getState() == DownloadEntity.STATE_RUNNING) {
// task = mQueue.createTask(mTargetName, mEntity);
// mQueue.stopTask(task);
// } else {
// Log.w(TAG, "停止命令执行失败,【调度器中没有该任务】");
// }
// } else {
// if (!TextUtils.isEmpty(mTargetName)) {
// task.setTargetName(mTargetName);
// }
// mQueue.stopTask(task);
// }
//}
} }

View File

@ -43,7 +43,7 @@ class ConnectionHelp {
if (urlConn instanceof HttpsURLConnection) { if (urlConn instanceof HttpsURLConnection) {
conn = (HttpsURLConnection) urlConn; conn = (HttpsURLConnection) urlConn;
SSLContext sslContext = SSLContext sslContext =
SSLContextUtil.getSSLContext(CAConfiguration.CA_ALIAS, CAConfiguration.CA_ALIAS); SSLContextUtil.getSSLContext(CAConfiguration.CA_ALIAS, CAConfiguration.CA_PATH);
if (sslContext == null) { if (sslContext == null) {
sslContext = SSLContextUtil.getDefaultSLLContext(); sslContext = SSLContextUtil.getDefaultSLLContext();
} }

View File

@ -48,8 +48,9 @@ public class DownloadTarget extends AbsTarget<DownloadEntity, DownloadTaskEntity
/** /**
* 重定向后新url的key默认为location * 重定向后新url的key默认为location
*/ */
public void setRedirectUrlKey(String redirectUrlKey) { public DownloadTarget setRedirectUrlKey(String redirectUrlKey) {
super._setRedirectUrlKey(redirectUrlKey); super._setRedirectUrlKey(redirectUrlKey);
return this;
} }
/** /**
@ -73,6 +74,13 @@ public class DownloadTarget extends AbsTarget<DownloadEntity, DownloadTaskEntity
return this; return this;
} }
/**
* 下载任务是否存在
*/
@Override public boolean taskExists(String downloadUrl) {
return DownloadTaskQueue.getInstance().getTask(downloadUrl) != null;
}
/** /**
* 设置请求类型 * 设置请求类型
* *

View File

@ -22,13 +22,12 @@ import android.os.Handler;
import android.util.Log; import android.util.Log;
import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.Aria;
import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.AriaManager;
import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.inf.ITask; import com.arialyy.aria.core.inf.ITask;
import com.arialyy.aria.core.scheduler.DownloadSchedulers; import com.arialyy.aria.core.scheduler.DownloadSchedulers;
import com.arialyy.aria.core.scheduler.ISchedulers; import com.arialyy.aria.core.scheduler.ISchedulers;
import com.arialyy.aria.util.CheckUtil; import com.arialyy.aria.util.CheckUtil;
import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.CommonUtil;
import com.arialyy.aria.util.Configuration; import com.arialyy.aria.util.Configuration_1;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
/** /**
@ -138,6 +137,10 @@ public class DownloadTask implements ITask {
this.mTargetName = targetName; this.mTargetName = targetName;
} }
@Override public void removeRecord() {
mEntity.deleteData();
}
/** /**
* 停止下载 * 停止下载
*/ */
@ -162,10 +165,7 @@ public class DownloadTask implements ITask {
* 取消下载 * 取消下载
*/ */
@Override public void cancel() { @Override public void cancel() {
if (mUtil.isDownloading()) { if (!mEntity.isDownloadComplete()) {
mUtil.cancelDownload();
} else {
// 如果任务不是下载状态
mUtil.cancelDownload(); mUtil.cancelDownload();
mUtil.delConfigFile(); mUtil.delConfigFile();
mUtil.delTempFile(); mUtil.delTempFile();
@ -178,6 +178,22 @@ public class DownloadTask implements ITask {
intent.putExtra(Aria.ENTITY, mEntity); intent.putExtra(Aria.ENTITY, mEntity);
mContext.sendBroadcast(intent); mContext.sendBroadcast(intent);
} }
//if (mEntity.isDownloadComplete()) {
// //mUtil.cancelDownload();
//} else {
// // 如果任务不是下载状态
// mUtil.cancelDownload();
// mUtil.delConfigFile();
// mUtil.delTempFile();
// mEntity.deleteData();
// if (mOutHandler != null) {
// mOutHandler.obtainMessage(DownloadSchedulers.CANCEL, this).sendToTarget();
// }
// //发送取消下载的广播
// Intent intent = CommonUtil.createIntent(mContext.getPackageName(), Aria.ACTION_CANCEL);
// intent.putExtra(Aria.ENTITY, mEntity);
// mContext.sendBroadcast(intent);
//}
} }
public static class Builder { public static class Builder {
@ -187,7 +203,8 @@ public class DownloadTask implements ITask {
String targetName; String targetName;
public Builder(String targetName, DownloadTaskEntity taskEntity) { public Builder(String targetName, DownloadTaskEntity taskEntity) {
CheckUtil.checkDownloadTaskEntity(taskEntity.downloadEntity); //CheckUtil.checkDownloadTaskEntity(taskEntity.downloadEntity);
CheckUtil.checkTaskEntity(taskEntity);
this.targetName = targetName; this.targetName = targetName;
this.taskEntity = taskEntity; this.taskEntity = taskEntity;
} }
@ -349,7 +366,7 @@ public class DownloadTask implements ITask {
downloadEntity.setDownloadComplete(action.equals(Aria.ACTION_COMPLETE)); downloadEntity.setDownloadComplete(action.equals(Aria.ACTION_COMPLETE));
downloadEntity.setCurrentProgress(location); downloadEntity.setCurrentProgress(location);
downloadEntity.update(); downloadEntity.update();
if (!Configuration.isOpenBreadCast) return; if (!Configuration_1.isOpenBreadCast) return;
Intent intent = CommonUtil.createIntent(context.getPackageName(), action); Intent intent = CommonUtil.createIntent(context.getPackageName(), action);
intent.putExtra(Aria.ENTITY, downloadEntity); intent.putExtra(Aria.ENTITY, downloadEntity);
if (location != -1) { if (location != -1) {

View File

@ -65,7 +65,8 @@ public class DownloadUtil implements IDownloadUtil, Runnable {
DownloadUtil(Context context, DownloadTaskEntity entity, IDownloadListener downloadListener, DownloadUtil(Context context, DownloadTaskEntity entity, IDownloadListener downloadListener,
int threadNum) { int threadNum) {
CheckUtil.checkDownloadTaskEntity(entity.downloadEntity); //CheckUtil.checkDownloadTaskEntity(entity.downloadEntity);
CheckUtil.checkTaskEntity(entity);
mDownloadEntity = entity.downloadEntity; mDownloadEntity = entity.downloadEntity;
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mDownloadTaskEntity = entity; mDownloadTaskEntity = entity;

View File

@ -21,7 +21,6 @@ import android.os.Message;
import android.util.Log; import android.util.Log;
import com.arialyy.aria.util.BufferedRandomAccessFile; import com.arialyy.aria.util.BufferedRandomAccessFile;
import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.CommonUtil;
import com.arialyy.aria.util.Configuration;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -55,7 +54,7 @@ final class SingleThreadTask implements Runnable {
if (mConfigEntity.isSupportBreakpoint) { if (mConfigEntity.isSupportBreakpoint) {
mConfigFPath = downloadInfo.CONFIG_FILE_PATH; mConfigFPath = downloadInfo.CONFIG_FILE_PATH;
} }
//mBufSize = Configuration.getInstance().getMaxSpeed(); //mBufSize = Configuration_1.getInstance().getMaxSpeed();
} }
@Override public void run() { @Override public void run() {

View File

@ -23,6 +23,7 @@ import com.arialyy.aria.core.RequestEnum;
import com.arialyy.aria.core.command.AbsCmd; import com.arialyy.aria.core.command.AbsCmd;
import com.arialyy.aria.core.command.CmdFactory; import com.arialyy.aria.core.command.CmdFactory;
import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.queue.DownloadTaskQueue;
import com.arialyy.aria.core.upload.UploadEntity; import com.arialyy.aria.core.upload.UploadEntity;
import com.arialyy.aria.orm.DbEntity; import com.arialyy.aria.orm.DbEntity;
import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.CommonUtil;
@ -50,6 +51,17 @@ public class AbsTarget<ENTITY extends IEntity, TASK_ENTITY extends ITaskEntity>
taskEntity.redirectUrlKey = redirectUrlKey; taskEntity.redirectUrlKey = redirectUrlKey;
} }
/**
* 删除记录
*/
public void removeRecord() {
if (entity instanceof DownloadEntity) {
((DownloadEntity) entity).deleteData();
} else if (entity instanceof UploadEntity) {
((UploadEntity) entity).deleteData();
}
}
/** /**
* 获取任务文件大小 * 获取任务文件大小
* *
@ -74,6 +86,13 @@ public class AbsTarget<ENTITY extends IEntity, TASK_ENTITY extends ITaskEntity>
return -1; return -1;
} }
/**
* 下载任务是否存在
*/
public boolean taskExists(String downloadUrl) {
return false;
}
/** /**
* 获取当前任务进度,如果任务存在,则返回当前进度 * 获取当前任务进度,如果任务存在,则返回当前进度
* *

View File

@ -51,4 +51,6 @@ public interface ITask {
public long getCurrentProgress(); public long getCurrentProgress();
public void setTargetName(String targetName); public void setTargetName(String targetName);
public void removeRecord();
} }

View File

@ -25,7 +25,7 @@ import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.queue.pool.CachePool; import com.arialyy.aria.core.queue.pool.CachePool;
import com.arialyy.aria.core.queue.pool.ExecutePool; import com.arialyy.aria.core.queue.pool.ExecutePool;
import com.arialyy.aria.core.scheduler.DownloadSchedulers; import com.arialyy.aria.core.scheduler.DownloadSchedulers;
import com.arialyy.aria.util.Configuration; import com.arialyy.aria.util.Configuration_1;
/** /**
* Created by lyy on 2016/8/17. * Created by lyy on 2016/8/17.
@ -121,7 +121,7 @@ public class DownloadTaskQueue
@Override public void setDownloadNum(int downloadNum) { @Override public void setDownloadNum(int downloadNum) {
//原始长度 //原始长度
int size = Configuration.getInstance().getDownloadNum(); int size = Configuration_1.getInstance().getDownloadNum();
int diff = downloadNum - size; int diff = downloadNum - size;
if (size == downloadNum) { if (size == downloadNum) {
Log.d(TAG, "设置的下载任务数和配置文件的下载任务数一直,跳过"); Log.d(TAG, "设置的下载任务数和配置文件的下载任务数一直,跳过");
@ -160,9 +160,13 @@ public class DownloadTaskQueue
} }
@Override public DownloadTask getTask(DownloadEntity entity) { @Override public DownloadTask getTask(DownloadEntity entity) {
DownloadTask task = mExecutePool.getTask(entity.getDownloadUrl()); return getTask(entity.getDownloadUrl());
}
@Override public DownloadTask getTask(String url) {
DownloadTask task = mExecutePool.getTask(url);
if (task == null) { if (task == null) {
task = mCachePool.getTask(entity.getDownloadUrl()); task = mCachePool.getTask(url);
} }
return task; return task;
} }

View File

@ -89,6 +89,14 @@ public interface ITaskQueue<TASK extends ITask, TASK_ENTITY extends ITaskEntity,
*/ */
public TASK getTask(ENTITY entity); public TASK getTask(ENTITY entity);
/**
* 通过工作实体缓存池或任务池搜索下载任务,如果缓存池或任务池都没有任务,则创建新任务
*
* @param url 链接地址,如果是下载,则为下载链接,如果是上传,为文件保存路径
* @return {@link DownloadTask}、{@link UploadTask}
*/
public TASK getTask(String url);
/** /**
* 通过工作实体删除任务 * 通过工作实体删除任务
* *

View File

@ -96,9 +96,13 @@ public class UploadTaskQueue extends AbsTaskQueue<UploadTask, UploadTaskEntity,
} }
@Override public UploadTask getTask(UploadEntity entity) { @Override public UploadTask getTask(UploadEntity entity) {
UploadTask task = mExecutePool.getTask(entity.getFilePath()); return getTask(entity.getFilePath());
}
@Override public UploadTask getTask(String url) {
UploadTask task = mExecutePool.getTask(url);
if (task == null) { if (task == null) {
task = mCachePool.getTask(entity.getFilePath()); task = mCachePool.getTask(url);
} }
return task; return task;
} }

View File

@ -20,7 +20,7 @@ import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.arialyy.aria.core.inf.ITask; import com.arialyy.aria.core.inf.ITask;
import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.CommonUtil;
import com.arialyy.aria.util.Configuration; import com.arialyy.aria.util.Configuration_1;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
@ -39,7 +39,7 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
private int mSize; private int mSize;
public ExecutePool() { public ExecutePool() {
mSize = Configuration.getInstance().getDownloadNum(); mSize = Configuration_1.getInstance().getDownloadNum();
mExecuteQueue = new ArrayBlockingQueue<>(mSize); mExecuteQueue = new ArrayBlockingQueue<>(mSize);
mExecuteArray = new HashMap<>(); mExecuteArray = new HashMap<>();
} }
@ -81,7 +81,7 @@ public class ExecutePool<TASK extends ITask> implements IPool<TASK> {
} }
mExecuteQueue = temp; mExecuteQueue = temp;
mSize = downloadNum; mSize = downloadNum;
Configuration.getInstance().setDownloadNum(mSize); Configuration_1.getInstance().setDownloadNum(mSize);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -22,7 +22,7 @@ import android.util.Log;
import com.arialyy.aria.core.queue.DownloadTaskQueue; import com.arialyy.aria.core.queue.DownloadTaskQueue;
import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.download.DownloadTask; import com.arialyy.aria.core.download.DownloadTask;
import com.arialyy.aria.util.Configuration; import com.arialyy.aria.util.Configuration_1;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -86,7 +86,7 @@ public class DownloadSchedulers implements ISchedulers<DownloadTask> {
case STOP: case STOP:
case CANCEL: case CANCEL:
mQueue.removeTask(entity); mQueue.removeTask(entity);
if (mQueue.size() < Configuration.getInstance().getDownloadNum()) { if (mQueue.size() < Configuration_1.getInstance().getDownloadNum()) {
startNextTask(); startNextTask();
} }
break; break;
@ -163,7 +163,7 @@ public class DownloadSchedulers implements ISchedulers<DownloadTask> {
* @param task 下载任务 * @param task 下载任务
*/ */
private void handleFailTask(final DownloadTask task) { private void handleFailTask(final DownloadTask task) {
final Configuration config = Configuration.getInstance(); final Configuration_1 config = Configuration_1.getInstance();
CountDownTimer timer = new CountDownTimer(config.getReTryInterval(), 1000) { CountDownTimer timer = new CountDownTimer(config.getReTryInterval(), 1000) {
@Override public void onTick(long millisUntilFinished) { @Override public void onTick(long millisUntilFinished) {

View File

@ -22,7 +22,7 @@ import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.queue.UploadTaskQueue; import com.arialyy.aria.core.queue.UploadTaskQueue;
import com.arialyy.aria.core.upload.UploadEntity; import com.arialyy.aria.core.upload.UploadEntity;
import com.arialyy.aria.core.upload.UploadTask; import com.arialyy.aria.core.upload.UploadTask;
import com.arialyy.aria.util.Configuration; import com.arialyy.aria.util.Configuration_1;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -69,7 +69,7 @@ public class UploadSchedulers implements ISchedulers<UploadTask> {
} }
private void handleFailTask(final UploadTask task) { private void handleFailTask(final UploadTask task) {
final Configuration config = Configuration.getInstance(); final Configuration_1 config = Configuration_1.getInstance();
CountDownTimer timer = new CountDownTimer(config.getReTryInterval(), 1000) { CountDownTimer timer = new CountDownTimer(config.getReTryInterval(), 1000) {
@Override public void onTick(long millisUntilFinished) { @Override public void onTick(long millisUntilFinished) {
@ -169,7 +169,7 @@ public class UploadSchedulers implements ISchedulers<UploadTask> {
case STOP: case STOP:
case CANCEL: case CANCEL:
mQueue.removeTask(entity); mQueue.removeTask(entity);
if (mQueue.size() < Configuration.getInstance().getDownloadNum()) { if (mQueue.size() < Configuration_1.getInstance().getDownloadNum()) {
startNextTask(); startNextTask();
} }
break; break;

View File

@ -100,6 +100,13 @@ public class UploadTarget extends AbsTarget<UploadEntity, UploadTaskEntity> {
return this; return this;
} }
/**
* 下载任务是否存在
*/
@Override public boolean taskExists(String downloadUrl) {
return UploadTaskQueue.getInstance().getTask(downloadUrl) != null;
}
/** /**
* 设置请求类型 * 设置请求类型
* *

View File

@ -26,7 +26,7 @@ import com.arialyy.aria.core.inf.ITask;
import com.arialyy.aria.core.scheduler.DownloadSchedulers; import com.arialyy.aria.core.scheduler.DownloadSchedulers;
import com.arialyy.aria.core.scheduler.ISchedulers; import com.arialyy.aria.core.scheduler.ISchedulers;
import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.CommonUtil;
import com.arialyy.aria.util.Configuration; import com.arialyy.aria.util.Configuration_1;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
/** /**
@ -55,6 +55,10 @@ public class UploadTask implements ITask {
mTargetName = targetName; mTargetName = targetName;
} }
@Override public void removeRecord() {
mUploadEntity.deleteData();
}
@Override public String getKey() { @Override public String getKey() {
return mUploadEntity.getFilePath(); return mUploadEntity.getFilePath();
} }
@ -87,9 +91,8 @@ public class UploadTask implements ITask {
} }
@Override public void cancel() { @Override public void cancel() {
if (mUtil.isRunning()) {
mUtil.cancel(); if (!mUploadEntity.isComplete()) {
} else {
// 如果任务不是下载状态 // 如果任务不是下载状态
mUtil.cancel(); mUtil.cancel();
mUploadEntity.deleteData(); mUploadEntity.deleteData();
@ -101,6 +104,21 @@ public class UploadTask implements ITask {
intent.putExtra(Aria.ENTITY, mUploadEntity); intent.putExtra(Aria.ENTITY, mUploadEntity);
AriaManager.APP.sendBroadcast(intent); AriaManager.APP.sendBroadcast(intent);
} }
//if (mUtil.isRunning()) {
// mUtil.cancel();
//} else {
// // 如果任务不是下载状态
// mUtil.cancel();
// mUploadEntity.deleteData();
// if (mOutHandler != null) {
// mOutHandler.obtainMessage(DownloadSchedulers.CANCEL, this).sendToTarget();
// }
// //发送取消下载的广播
// Intent intent = CommonUtil.createIntent(AriaManager.APP.getPackageName(), Aria.ACTION_CANCEL);
// intent.putExtra(Aria.ENTITY, mUploadEntity);
// AriaManager.APP.sendBroadcast(intent);
//}
} }
public String getTargetName() { public String getTargetName() {
@ -220,7 +238,7 @@ public class UploadTask implements ITask {
entity.setComplete(action.equals(Aria.ACTION_COMPLETE)); entity.setComplete(action.equals(Aria.ACTION_COMPLETE));
entity.setCurrentProgress(location); entity.setCurrentProgress(location);
entity.update(); entity.update();
if (!Configuration.isOpenBreadCast) return; if (!Configuration_1.isOpenBreadCast) return;
Intent intent = CommonUtil.createIntent(AriaManager.APP.getPackageName(), action); Intent intent = CommonUtil.createIntent(AriaManager.APP.getPackageName(), action);
intent.putExtra(Aria.ENTITY, entity); intent.putExtra(Aria.ENTITY, entity);
if (location != -1) { if (location != -1) {

View File

@ -50,7 +50,7 @@ final class UploadUtil implements Runnable {
UploadUtil(UploadTaskEntity taskEntity, IUploadListener listener) { UploadUtil(UploadTaskEntity taskEntity, IUploadListener listener) {
mTaskEntity = taskEntity; mTaskEntity = taskEntity;
CheckUtil.checkUploadTaskEntity(taskEntity.uploadEntity); CheckUtil.checkTaskEntity(taskEntity);
mUploadEntity = taskEntity.uploadEntity; mUploadEntity = taskEntity.uploadEntity;
if (listener == null) { if (listener == null) {
throw new IllegalArgumentException("上传监听不能为空"); throw new IllegalArgumentException("上传监听不能为空");

View File

@ -21,13 +21,9 @@ import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.arialyy.aria.util.CheckUtil; import com.arialyy.aria.util.CheckUtil;
import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.CommonUtil;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -73,7 +69,7 @@ public class DbUtil {
*/ */
synchronized <T extends DbEntity> void delData(Class<T> clazz, String... expression) { synchronized <T extends DbEntity> void delData(Class<T> clazz, String... expression) {
CheckUtil.checkSqlExpression(expression); CheckUtil.checkSqlExpression(expression);
mDb = mHelper.getWritableDatabase(); checkDb();
SqlHelper.delData(mDb, clazz, expression); SqlHelper.delData(mDb, clazz, expression);
} }
@ -81,7 +77,7 @@ public class DbUtil {
* 修改某行数据 * 修改某行数据
*/ */
synchronized void modifyData(DbEntity dbEntity) { synchronized void modifyData(DbEntity dbEntity) {
mDb = mHelper.getWritableDatabase(); checkDb();
SqlHelper.modifyData(mDb, dbEntity); SqlHelper.modifyData(mDb, dbEntity);
} }
@ -89,9 +85,7 @@ public class DbUtil {
* 遍历所有数据 * 遍历所有数据
*/ */
synchronized <T extends DbEntity> List<T> findAllData(Class<T> clazz) { synchronized <T extends DbEntity> List<T> findAllData(Class<T> clazz) {
if (mDb == null || !mDb.isOpen()) { checkDb();
mDb = mHelper.getReadableDatabase();
}
return SqlHelper.findAllData(mDb, clazz); return SqlHelper.findAllData(mDb, clazz);
} }
@ -99,7 +93,7 @@ public class DbUtil {
* 条件查寻数据 * 条件查寻数据
*/ */
synchronized <T extends DbEntity> List<T> findData(Class<T> clazz, String... expression) { synchronized <T extends DbEntity> List<T> findData(Class<T> clazz, String... expression) {
mDb = mHelper.getReadableDatabase(); checkDb();
return SqlHelper.findData(mDb, clazz, expression); return SqlHelper.findData(mDb, clazz, expression);
} }
@ -108,7 +102,7 @@ public class DbUtil {
*/ */
@Deprecated synchronized <T extends DbEntity> List<T> findData(Class<T> clazz, @Deprecated synchronized <T extends DbEntity> List<T> findData(Class<T> clazz,
@NonNull String[] wheres, @NonNull String[] values) { @NonNull String[] wheres, @NonNull String[] values) {
mDb = mHelper.getReadableDatabase(); checkDb();
return SqlHelper.findData(mDb, clazz, wheres, values); return SqlHelper.findData(mDb, clazz, wheres, values);
} }
@ -116,9 +110,7 @@ public class DbUtil {
* 插入数据 * 插入数据
*/ */
synchronized void insertData(DbEntity dbEntity) { synchronized void insertData(DbEntity dbEntity) {
if (mDb == null || !mDb.isOpen()) { checkDb();
mDb = mHelper.getReadableDatabase();
}
SqlHelper.insertData(mDb, dbEntity); SqlHelper.insertData(mDb, dbEntity);
} }
@ -126,19 +118,21 @@ public class DbUtil {
* 查找某张表是否存在 * 查找某张表是否存在
*/ */
synchronized boolean tableExists(Class clazz) { synchronized boolean tableExists(Class clazz) {
if (mDb == null || !mDb.isOpen()) { checkDb();
mDb = mHelper.getReadableDatabase();
}
return SqlHelper.tableExists(mDb, clazz); return SqlHelper.tableExists(mDb, clazz);
} }
synchronized void createTable(Class clazz, String tableName) { synchronized void createTable(Class clazz, String tableName) {
if (mDb == null || !mDb.isOpen()) { checkDb();
mDb = mHelper.getWritableDatabase();
}
SqlHelper.createTable(mDb, clazz, tableName); SqlHelper.createTable(mDb, clazz, tableName);
} }
private void checkDb(){
if (mDb == null || !mDb.isOpen()) {
mDb = mHelper.getReadableDatabase();
}
}
/** /**
* 创建表 * 创建表
*/ */
@ -159,7 +153,7 @@ public class DbUtil {
* 获取所在行Id * 获取所在行Id
*/ */
synchronized int[] getRowId(Class clazz) { synchronized int[] getRowId(Class clazz) {
mDb = mHelper.getReadableDatabase(); checkDb();
Cursor cursor = mDb.rawQuery("SELECT rowid, * FROM " + CommonUtil.getClassName(clazz), null); Cursor cursor = mDb.rawQuery("SELECT rowid, * FROM " + CommonUtil.getClassName(clazz), null);
int[] ids = new int[cursor.getCount()]; int[] ids = new int[cursor.getCount()];
int i = 0; int i = 0;
@ -176,7 +170,7 @@ public class DbUtil {
* 获取行Id * 获取行Id
*/ */
synchronized int getRowId(Class clazz, Object[] wheres, Object[] values) { synchronized int getRowId(Class clazz, Object[] wheres, Object[] values) {
mDb = mHelper.getReadableDatabase(); checkDb();
if (wheres.length <= 0 || values.length <= 0) { if (wheres.length <= 0 || values.length <= 0) {
Log.e(TAG, "请输入删除条件"); Log.e(TAG, "请输入删除条件");
return -1; return -1;

View File

@ -17,6 +17,7 @@
package com.arialyy.aria.util; package com.arialyy.aria.util;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.download.DownloadTaskEntity; import com.arialyy.aria.core.download.DownloadTaskEntity;
import com.arialyy.aria.core.inf.ITaskEntity; import com.arialyy.aria.core.inf.ITaskEntity;
@ -95,31 +96,39 @@ public class CheckUtil {
/** /**
* 检查命令实体 * 检查命令实体
*
* @param checkPath 删除命令不需要检查下载路径和文件名
*/ */
public static void checkCmdEntity(ITaskEntity entity) { public static boolean checkCmdEntity(ITaskEntity entity, boolean checkPath) {
boolean b = false;
if (entity instanceof DownloadTaskEntity) { if (entity instanceof DownloadTaskEntity) {
DownloadEntity entity1 = ((DownloadTaskEntity) entity).downloadEntity; DownloadEntity entity1 = ((DownloadTaskEntity) entity).downloadEntity;
if (entity1 == null) { if (entity1 == null) {
throw new NullPointerException("下载实体不能为空"); Log.e(TAG, "下载实体不能为空");
} else if (TextUtils.isEmpty(entity1.getDownloadUrl())) { } else if (checkPath && TextUtils.isEmpty(entity1.getDownloadUrl())) {
throw new IllegalArgumentException("下载链接不能为空"); Log.e(TAG, "下载链接不能为空");
} else if (TextUtils.isEmpty(entity1.getDownloadPath())) { } else if (checkPath && TextUtils.isEmpty(entity1.getDownloadPath())) {
throw new IllegalArgumentException("保存路径不能为空"); Log.e(TAG, "保存路径不能为空");
} else {
b = true;
} }
} else if (entity instanceof UploadTaskEntity) { } else if (entity instanceof UploadTaskEntity) {
UploadEntity entity1 = ((UploadTaskEntity) entity).uploadEntity; UploadEntity entity1 = ((UploadTaskEntity) entity).uploadEntity;
if (entity1 == null) { if (entity1 == null) {
throw new NullPointerException("上传实体不能为空"); Log.e(TAG, "上传实体不能为空");
} else if (TextUtils.isEmpty(entity1.getFilePath())) { } else if (TextUtils.isEmpty(entity1.getFilePath())) {
throw new IllegalArgumentException("上传文件路径不能为空"); Log.e(TAG, "上传文件路径不能为空");
} else {
b = true;
} }
} }
return b;
} }
/** /**
* 检查上传实体是否合法 * 检查上传实体是否合法
*/ */
public static void checkUploadTaskEntity(UploadEntity entity) { private static void checkUploadTaskEntity(UploadEntity entity) {
if (entity == null) { if (entity == null) {
throw new NullPointerException("上传实体不能为空"); throw new NullPointerException("上传实体不能为空");
} else if (TextUtils.isEmpty(entity.getFilePath())) { } else if (TextUtils.isEmpty(entity.getFilePath())) {
@ -135,7 +144,7 @@ public class CheckUtil {
* *
* @param entity 下载实体 * @param entity 下载实体
*/ */
public static void checkDownloadTaskEntity(DownloadEntity entity) { private static void checkDownloadTaskEntity(DownloadEntity entity) {
if (entity == null) { if (entity == null) {
throw new NullPointerException("下载实体不能为空"); throw new NullPointerException("下载实体不能为空");
} else if (TextUtils.isEmpty(entity.getDownloadUrl())) { } else if (TextUtils.isEmpty(entity.getDownloadUrl())) {

View File

@ -28,8 +28,8 @@ import java.util.WeakHashMap;
* Created by AriaL on 2016/12/8. * Created by AriaL on 2016/12/8.
* 信息配置 * 信息配置
*/ */
public class Configuration { public class Configuration_1 {
private static final String TAG = "Configuration"; private static final String TAG = "Configuration_1";
private static final String CONFIG_FILE = "/Aria/ADConfig.properties"; private static final String CONFIG_FILE = "/Aria/ADConfig.properties";
/** /**
* 当前调度器最大下载数默认最大下载数为 2 * 当前调度器最大下载数默认最大下载数为 2
@ -58,20 +58,20 @@ public class Configuration {
public static boolean isOpenBreadCast = false; public static boolean isOpenBreadCast = false;
private static Configuration INSTANCE = null; private static Configuration_1 INSTANCE = null;
private File mConfigFile = null; private File mConfigFile = null;
private static final Object LOCK = new Object(); private static final Object LOCK = new Object();
public static Configuration getInstance() { public static Configuration_1 getInstance() {
if (INSTANCE == null) { if (INSTANCE == null) {
synchronized (LOCK) { synchronized (LOCK) {
INSTANCE = new Configuration(); INSTANCE = new Configuration_1();
} }
} }
return INSTANCE; return INSTANCE;
} }
private Configuration() { private Configuration_1() {
mConfigFile = new File(AriaManager.APP.getFilesDir().getPath() + CONFIG_FILE); mConfigFile = new File(AriaManager.APP.getFilesDir().getPath() + CONFIG_FILE);
try { try {
if (!mConfigFile.exists()) { if (!mConfigFile.exists()) {

View File

@ -20,7 +20,7 @@ Aria怎样使用
## 下载 ## 下载
[![Download](https://api.bintray.com/packages/arialyy/maven/Aria/images/download.svg)](https://bintray.com/arialyy/maven/Aria/_latestVersion)</br> [![Download](https://api.bintray.com/packages/arialyy/maven/Aria/images/download.svg)](https://bintray.com/arialyy/maven/Aria/_latestVersion)</br>
```java ```java
compile 'com.arialyy.aria:Aria:3.0.2' compile 'com.arialyy.aria:Aria:3.0.3'
``` ```
## 示例 ## 示例
@ -149,6 +149,7 @@ compile 'com.arialyy.aria:Aria:3.0.2'
*** ***
## 开发日志 ## 开发日志
+ v_3.0.3 修复暂停后删除任务闪退问题添加删除记录的api
+ v_3.0.2 支持30x重定向链接下载 + v_3.0.2 支持30x重定向链接下载
+ v_3.0.0 添加上传任务支持修复一些已发现的bug + v_3.0.0 添加上传任务支持修复一些已发现的bug
+ v_2.4.4 修复不支持断点的下载链接拿不到文件大小的问题 + v_2.4.4 修复不支持断点的下载链接拿不到文件大小的问题

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<aria>
<download>
<!--是否打开下载广播默认为false-->
<openBroadcast value="false"/>
<!--设置下载队列最大任务数, 默认为2-->
<maxQueueNum value="2"/>
<!--设置下载失败重试次数默认为10-->
<reTryNum value="10"/>
<!--设置重试间隔单位为毫秒默认2000毫秒-->
<reTryInterval value="2000"/>
<!--设置IO流读取时间单位为毫秒默认20000毫秒该时间不能少于10000毫秒-->
<readTimeout value="20000"/>
<!--设置写文件buff大小该数值大小不能小于2048数值变小下载速度会变慢-->
<buffSize value="8192"/>
<!--设置https ca 证书信息path 为assets目录下的CA证书完整路径name 为CA证书名-->
<ca name="" path=""/>
</download>
<upload>
<!--是否打开上传广播默认为false-->
<openBroadcast value="false"/>
<!--设置上传队列最大任务数, 默认为2-->
<maxQueueNum value="2"/>
<!--设置上传失败重试次数默认为10-->
<reTryNum value="10"/>
<!--设置重试间隔,单位为毫秒-->
<reTryInterval value="2000"/>
<!--设置url连接超时时间单位为毫秒默认5000毫秒-->
<connectTimeOut value="5000"/>
</upload>
</aria>

View File

@ -55,10 +55,11 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
private static final String DOWNLOAD_URL = private static final String DOWNLOAD_URL =
//"http://kotlinlang.org/docs/kotlin-docs.pdf"; //"http://kotlinlang.org/docs/kotlin-docs.pdf";
//"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe"; //"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe";
//"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk"; "http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk";
//不支持断点的链接 //"http://static.gaoshouyou.com/d/36/69/2d3699acfa69e9632262442c46516ad8.apk";
//"http://ox.konsung.net:5555/ksdc-web/download/downloadFile/?fileName=ksdc_1.0.2.apk&rRange=0-"; //不支持断点的链接
"http://172.18.104.50:8080/download/_302turn"; //"http://ox.konsung.net:5555/ksdc-web/download/downloadFile/?fileName=ksdc_1.0.2.apk&rRange=0-";
//"http://172.18.104.50:8080/download/_302turn";
@Bind(R.id.progressBar) HorizontalProgressBarWithNumber mPb; @Bind(R.id.progressBar) HorizontalProgressBarWithNumber mPb;
@Bind(R.id.start) Button mStart; @Bind(R.id.start) Button mStart;
@Bind(R.id.stop) Button mStop; @Bind(R.id.stop) Button mStop;
@ -233,6 +234,7 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
private void stop() { private void stop() {
Aria.download(this).load(DOWNLOAD_URL).pause(); Aria.download(this).load(DOWNLOAD_URL).pause();
//Aria.download(this).load(DOWNLOAD_URL).removeRecord();
} }
private void cancel() { private void cancel() {