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 AbsCmd implements 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