From da5fbcb462c25a51ebd84cf1352d734a804bb1e9 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Wed, 21 Jun 2017 23:48:29 +0800 Subject: [PATCH] https://github.com/AriaLyy/Aria/issues/57 --- .../com/arialyy/aria/core/AriaManager.java | 20 +++++++++++ .../com/arialyy/aria/core/ConfigHelper.java | 19 ++++++++++- .../java/com/arialyy/aria/core/QueueMod.java | 29 ++++++++++++++++ .../com/arialyy/aria/core/command/AbsCmd.java | 7 ++++ .../arialyy/aria/core/command/StartCmd.java | 21 +++++++++++- .../aria/core/download/DownloadReceiver.java | 6 ++++ .../arialyy/aria/core/queue/AbsTaskQueue.java | 4 +++ .../arialyy/aria/core/queue/ITaskQueue.java | 8 +++++ .../java/com/arialyy/aria/orm/SqlHelper.java | 3 ++ app/build.gradle | 4 +-- app/src/main/assets/aria_config.xml | 3 ++ .../simple/download/SingleTaskActivity.java | 2 +- .../simple/test/TestMutilTaskSysDownload.java | 33 +++++++++++-------- .../com/arialyy/aria/core/Configuration.java | 19 ++++++++++- 14 files changed, 159 insertions(+), 19 deletions(-) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/QueueMod.java diff --git a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java index dacb0aea..5bcad9cb 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java +++ b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java @@ -86,6 +86,26 @@ import org.xml.sax.SAXException; return mReceivers; } + /** + * 设置上传任务的执行队列类型 + * + * @param mod {@link com.arialyy.aria.core.QueueMod} + */ + public AriaManager setUploadQueueMod(QueueMod mod) { + mUConfig.setQueueMod(mod.tag); + return this; + } + + /** + * 设置下载任务的执行队列类型 + * + * @param mod {@link com.arialyy.aria.core.QueueMod} + */ + public AriaManager setDownloadQueueMod(QueueMod mod) { + mDConfig.setQueueMod(mod.tag); + return this; + } + /** * 如果需要在代码中修改下载配置,请使用以下方法 *
diff --git a/Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java b/Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java index e4c94262..260d1d29 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java +++ b/Aria/src/main/java/com/arialyy/aria/core/ConfigHelper.java @@ -86,16 +86,33 @@ class ConfigHelper extends DefaultHandler { case "maxSpeed": loadMaxSpeed(value); break; + case "queueMod": + loadQueueMod(value); + break; } } } + private void loadQueueMod(String value) { + String mod = "now"; + if (!TextUtils.isEmpty(value) && (value.equalsIgnoreCase("now") || value.equalsIgnoreCase( + "wait"))) { + mod = value; + } + if (isDownloadConfig) { + mDownloadConfig.queueMod = mod; + } + if (isUploadConfig) { + mUploadConfig.queueMod = mod; + } + } + private void loadMaxSpeed(String value) { double maxSpeed = 0.0; if (!TextUtils.isEmpty(value)) { maxSpeed = Double.parseDouble(value); } - if (isDownloadConfig){ + if (isDownloadConfig) { mDownloadConfig.msxSpeed = maxSpeed; } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/QueueMod.java b/Aria/src/main/java/com/arialyy/aria/core/QueueMod.java new file mode 100644 index 00000000..70d02300 --- /dev/null +++ b/Aria/src/main/java/com/arialyy/aria/core/QueueMod.java @@ -0,0 +1,29 @@ +package com.arialyy.aria.core; + +/** + * Created by Aria.Lao on 2017/6/21. + * 执行队列类型 + */ +public enum QueueMod { + /** + * 等待模式,如果执行队列已经满了,再次使用start命令执行任务时,该任务会被添加到缓存队列中 + * 当执行队列的任务完成时,将自动执行缓存队列中的任务 + */ + WAIT("wait"), + + /** + * 立刻执行模式 + * 如果执行队列已经满了,再次使用start命令执行任务时,该任务会添加到执行队列队尾,而原来执行队列的队首任务会停止 + */ + NOW("now"); + + String tag; + + public String getTag() { + return tag; + } + + QueueMod(String tag) { + this.tag = tag; + } +} diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java index 1107dbfd..a90d006e 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/AbsCmd.java @@ -39,6 +39,11 @@ public abstract class AbsCmdimplements ICmd { * 能否执行命令 */ boolean canExeCmd = true; + /** + * 是否是下载任务的命令 + * {@code true} 下载任务的命令,{@code false} 上传任务的命令 + */ + boolean isDownloadCmd = true; /** * @param targetName 产生任务的对象名 @@ -51,8 +56,10 @@ public abstract class AbsCmd implements ICmd { TAG = CommonUtil.getClassName(this); if (entity instanceof DownloadTaskEntity) { mQueue = DownloadTaskQueue.getInstance(); + isDownloadCmd = true; } else if (entity instanceof UploadTaskEntity) { mQueue = UploadTaskQueue.getInstance(); + isDownloadCmd = false; } } } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/StartCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/StartCmd.java index 82821ea8..284a5df8 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/StartCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/StartCmd.java @@ -17,6 +17,9 @@ package com.arialyy.aria.core.command; import android.text.TextUtils; +import android.util.Log; +import com.arialyy.aria.core.AriaManager; +import com.arialyy.aria.core.QueueMod; import com.arialyy.aria.core.inf.ITask; import com.arialyy.aria.core.inf.AbsTaskEntity; @@ -40,7 +43,23 @@ class StartCmd extends AbsCmd { if (!TextUtils.isEmpty(mTargetName)) { task.setTargetName(mTargetName); } - mQueue.startTask(task); + String mod; + int maxTaskNum; + AriaManager manager = AriaManager.getInstance(AriaManager.APP); + if (isDownloadCmd) { + mod = manager.getDownloadConfig().getQueueMod(); + maxTaskNum = manager.getDownloadConfig().getMaxTaskNum(); + } else { + mod = manager.getUploadConfig().getQueueMod(); + maxTaskNum = manager.getUploadConfig().getMaxTaskNum(); + } + if (mod.equals(QueueMod.NOW.getTag())) { + mQueue.startTask(task); + }else if (mod.equals(QueueMod.WAIT.getTag())){ + if (mQueue.getExeTaskNum() < maxTaskNum){ + mQueue.startTask(task); + } + } } } } \ No newline at end of file diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java index 8f29f02f..9c12f140 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java @@ -18,6 +18,7 @@ package com.arialyy.aria.core.download; import android.support.annotation.NonNull; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.inf.ICmd; +import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.IReceiver; import com.arialyy.aria.core.command.CmdFactory; import com.arialyy.aria.core.command.AbsCmd; @@ -26,6 +27,7 @@ import com.arialyy.aria.core.scheduler.ISchedulerListener; import com.arialyy.aria.orm.DbEntity; import com.arialyy.aria.util.CheckUtil; import com.arialyy.aria.util.CommonUtil; +import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -67,6 +69,10 @@ public class DownloadReceiver implements IReceiver { if (entity == null) { entity = new DownloadEntity(); } + File file = new File(entity.getDownloadPath()); + if (!file.exists()) { + entity.setState(IEntity.STATE_WAIT); + } entity.setDownloadUrl(downloadUrl); return new DownloadTarget(entity, targetName); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java index 625d28dd..eb133913 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/AbsTaskQueue.java @@ -36,6 +36,10 @@ abstract class AbsTaskQueue mCachePool = new CachePool<>(); ExecutePool mExecutePool; + @Override public boolean taskIsRunning(String key) { + return mExecutePool.getTask(key) != null; + } + /** * 停止所有任务 */ diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java index 9c9bd7c0..538fc919 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java @@ -32,6 +32,14 @@ import com.arialyy.aria.core.upload.UploadTaskEntity; */ public interface ITaskQueue { + /** + * 通过key判断任务是否正在执行 + * + * @param key 下载链接,或上传文件的路径 + * @return {@code true} 任务正在运行 + */ + boolean taskIsRunning(String key); + /** * 停止所有任务 */ diff --git a/Aria/src/main/java/com/arialyy/aria/orm/SqlHelper.java b/Aria/src/main/java/com/arialyy/aria/orm/SqlHelper.java index 0d643822..4920bef0 100644 --- a/Aria/src/main/java/com/arialyy/aria/orm/SqlHelper.java +++ b/Aria/src/main/java/com/arialyy/aria/orm/SqlHelper.java @@ -187,6 +187,7 @@ final class SqlHelper extends SQLiteOpenHelper { print(FIND_DATA, sql); Cursor cursor = db.rawQuery(sql, null); List data = cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null; + cursor.close(); close(db); return data; } @@ -215,6 +216,7 @@ final class SqlHelper extends SQLiteOpenHelper { print(FIND_DATA, sb.toString()); Cursor cursor = db.rawQuery(sb.toString(), null); List data = cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null; + cursor.close(); close(db); return data; } @@ -229,6 +231,7 @@ final class SqlHelper extends SQLiteOpenHelper { print(FIND_ALL_DATA, sb.toString()); Cursor cursor = db.rawQuery(sb.toString(), null); List data = cursor.getCount() > 0 ? newInstanceEntity(clazz, cursor) : null; + cursor.close(); close(db); return data; } diff --git a/app/build.gradle b/app/build.gradle index e4a53267..58c03308 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,7 +42,7 @@ dependencies { compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.arialyy.frame:MVVM2:2.2.0' compile project(':Aria') -// compile 'com.arialyy.aria:aria-core:3.1.8' -// annotationProcessor 'com.arialyy.aria:aria-compiler:3.1.8' +// compile 'com.arialyy.aria:aria-core:3.1.9' +// annotationProcessor 'com.arialyy.aria:aria-compiler:3.1.9' } diff --git a/app/src/main/assets/aria_config.xml b/app/src/main/assets/aria_config.xml index f9ed36f3..9972caa4 100644 --- a/app/src/main/assets/aria_config.xml +++ b/app/src/main/assets/aria_config.xml @@ -34,6 +34,9 @@ + + + diff --git a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index 6e3b468e..e96fd2c2 100644 --- a/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -153,7 +153,7 @@ public class SingleTaskActivity extends BaseActivity { switch (item.getItemId()) { case R.id.help: msg = "一些小知识点:\n" - + "1、你可以通过task.getKey().equals(DOWNLOAD_URL)判断是否是当前页面的下载,以防止progress乱跳\n" + + "1、你可以在注解中增加链接,用于指定被注解的方法只能被特定的下载任务回调,以防止progress乱跳\n" + "2、当遇到网络慢的情况时,你可以先使用onPre()更新UI界面,待连接成功时,再在onTaskPre()获取完整的task数据,然后给UI界面设置正确的数据\n" + "3、你可以在界面初始化时通过Aria.download(this).load(DOWNLOAD_URL).getPercent()等方法快速获取相关任务的一些数据"; showMsgDialog("tip", msg); diff --git a/app/src/main/java/com/arialyy/simple/test/TestMutilTaskSysDownload.java b/app/src/main/java/com/arialyy/simple/test/TestMutilTaskSysDownload.java index 530442a0..45e659aa 100644 --- a/app/src/main/java/com/arialyy/simple/test/TestMutilTaskSysDownload.java +++ b/app/src/main/java/com/arialyy/simple/test/TestMutilTaskSysDownload.java @@ -3,6 +3,7 @@ package com.arialyy.simple.test; import android.os.Environment; import android.view.View; import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.QueueMod; import com.arialyy.simple.R; import com.arialyy.simple.base.BaseActivity; import com.arialyy.simple.databinding.TestActivityMultiBinding; @@ -54,20 +55,26 @@ public class TestMutilTaskSysDownload extends BaseActivity