From 62d6434914d3bb8400c3f679df4a1fbac8364556 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Mon, 6 Feb 2017 18:25:21 +0800 Subject: [PATCH 01/37] =?UTF-8?q?3.0=20=E7=89=88=E6=9C=AC=E7=BC=96?= =?UTF-8?q?=E5=86=99=E3=80=81=E6=B7=BB=E5=8A=A0header=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E3=80=81=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/arialyy/aria/core/AMTarget.java | 51 +++++-- .../arialyy/aria/core/AMUplodReceiver.java | 8 - .../main/java/com/arialyy/aria/core/Aria.java | 139 +++++------------- .../com/arialyy/aria/core/AriaManager.java | 56 +++---- .../arialyy/aria/core/DownloadManager.java | 2 +- .../arialyy/aria/core/DownloadTaskEntity.java | 19 +++ .../com/arialyy/aria/core/RequestEnum.java | 2 +- .../com/arialyy/aria/core/TaskEntity.java | 10 -- .../arialyy/aria/core/command/SingleCmd.java | 48 ------ .../core/command/{ => download}/AddCmd.java | 11 +- .../command/{ => download}/CancelCmd.java | 15 +- .../command/{ => download}/CmdFactory.java | 27 ++-- .../command/{ => download}/IDownloadCmd.java | 11 +- .../aria/core/command/download/SingleCmd.java | 48 ++++++ .../core/command/{ => download}/StartCmd.java | 15 +- .../core/command/{ => download}/StopCmd.java | 20 ++- .../aria/core/queue/DownloadTaskQueue.java | 4 +- .../arialyy/aria/core/queue/ITaskQueue.java | 5 +- .../DownloadReceiver.java} | 17 ++- .../arialyy/aria/core/receiver/IReceiver.java | 24 +++ .../aria/core/receiver/UploadReceiver.java | 24 +++ .../aria/core/task/ConnectionHelp.java | 13 +- .../arialyy/aria/core/task/DownloadUtil.java | 18 ++- .../aria/core/task/SingleThreadTask.java | 3 +- .../java/com/arialyy/aria/core/task/Task.java | 60 ++++---- .../arialyy/aria/core/task/TaskFactory.java | 15 +- .../java/com/arialyy/aria/util/CheckUtil.java | 15 +- .../com/arialyy/aria/util/CommonUtil.java | 9 +- .../simple/dialog_task/DownloadDialog.java | 10 +- .../fragment_task/DownloadFragment.java | 10 +- .../simple/multi_task/DownloadActivity.java | 2 +- .../simple/multi_task/DownloadAdapter.java | 6 +- .../simple/multi_task/FileListAdapter.java | 3 +- .../simple/multi_task/MultiTaskActivity.java | 4 +- .../notification/SimpleNotification.java | 8 +- .../simple/pop_task/DownloadPopupWindow.java | 10 +- .../single_task/SingleTaskActivity.java | 12 +- 37 files changed, 397 insertions(+), 357 deletions(-) delete mode 100644 Aria/src/main/java/com/arialyy/aria/core/AMUplodReceiver.java create mode 100644 Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java delete mode 100644 Aria/src/main/java/com/arialyy/aria/core/TaskEntity.java delete mode 100644 Aria/src/main/java/com/arialyy/aria/core/command/SingleCmd.java rename Aria/src/main/java/com/arialyy/aria/core/command/{ => download}/AddCmd.java (79%) rename Aria/src/main/java/com/arialyy/aria/core/command/{ => download}/CancelCmd.java (79%) rename Aria/src/main/java/com/arialyy/aria/core/command/{ => download}/CmdFactory.java (80%) rename Aria/src/main/java/com/arialyy/aria/core/command/{ => download}/IDownloadCmd.java (82%) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/command/download/SingleCmd.java rename Aria/src/main/java/com/arialyy/aria/core/command/{ => download}/StartCmd.java (79%) rename Aria/src/main/java/com/arialyy/aria/core/command/{ => download}/StopCmd.java (78%) rename Aria/src/main/java/com/arialyy/aria/core/{AMReceiver.java => receiver/DownloadReceiver.java} (82%) create mode 100644 Aria/src/main/java/com/arialyy/aria/core/receiver/IReceiver.java create mode 100644 Aria/src/main/java/com/arialyy/aria/core/receiver/UploadReceiver.java diff --git a/Aria/src/main/java/com/arialyy/aria/core/AMTarget.java b/Aria/src/main/java/com/arialyy/aria/core/AMTarget.java index cf7e5742..d5b1a5ad 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/AMTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/AMTarget.java @@ -17,25 +17,56 @@ package com.arialyy.aria.core; import android.support.annotation.NonNull; import android.text.TextUtils; -import com.arialyy.aria.core.command.CmdFactory; -import com.arialyy.aria.core.command.IDownloadCmd; +import com.arialyy.aria.core.command.download.CmdFactory; +import com.arialyy.aria.core.command.download.IDownloadCmd; import com.arialyy.aria.util.CheckUtil; import com.arialyy.aria.util.CommonUtil; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; /** * Created by lyy on 2016/12/5. * https://github.com/AriaLyy/Aria */ public class AMTarget { - //private AMReceiver mReceiver; DownloadEntity entity; String targetName; + DownloadTaskEntity taskEntity; - AMTarget(DownloadEntity entity, String targetName) { + public AMTarget(DownloadEntity entity, String targetName) { this.entity = entity; this.targetName = targetName; + taskEntity = new DownloadTaskEntity(entity); + } + + /** + * 给url请求添加头部 + * + * @param key 头部key + * @param header 头部value + */ + public AMTarget addHeader(@NonNull String key, @NonNull String header) { + taskEntity.headers.put(key, header); + return this; + } + + /** + * 给url请求添加头部 + * + * @param headers Map + */ + public AMTarget addHeaders(Map headers) { + if (headers != null && headers.size() > 0) { + Set keys = headers.keySet(); + for (String key : keys) { + taskEntity.headers.put(key, headers.get(key)); + } + } + return this; } /** @@ -92,7 +123,7 @@ public class AMTarget { */ public void add() { DownloadManager.getInstance() - .setCmd(CommonUtil.createCmd(targetName, entity, CmdFactory.TASK_CREATE)) + .setCmd(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_CREATE)) .exe(); } @@ -101,8 +132,8 @@ public class AMTarget { */ public void start() { List cmds = new ArrayList<>(); - cmds.add(CommonUtil.createCmd(targetName, entity, CmdFactory.TASK_CREATE)); - cmds.add(CommonUtil.createCmd(targetName, entity, CmdFactory.TASK_START)); + cmds.add(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_CREATE)); + cmds.add(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_START)); DownloadManager.getInstance().setCmds(cmds).exe(); cmds.clear(); } @@ -112,7 +143,7 @@ public class AMTarget { */ public void stop() { DownloadManager.getInstance() - .setCmd(CommonUtil.createCmd(targetName, entity, CmdFactory.TASK_STOP)) + .setCmd(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_STOP)) .exe(); } @@ -121,7 +152,7 @@ public class AMTarget { */ public void resume() { DownloadManager.getInstance() - .setCmd(CommonUtil.createCmd(targetName, entity, CmdFactory.TASK_START)) + .setCmd(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_START)) .exe(); } @@ -130,7 +161,7 @@ public class AMTarget { */ public void cancel() { DownloadManager.getInstance() - .setCmd(CommonUtil.createCmd(targetName, entity, CmdFactory.TASK_CANCEL)) + .setCmd(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_CANCEL)) .exe(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/AMUplodReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/AMUplodReceiver.java deleted file mode 100644 index 981c5e6d..00000000 --- a/Aria/src/main/java/com/arialyy/aria/core/AMUplodReceiver.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.arialyy.aria.core; - -/** - * Created by Aria.Lao on 2017/1/18. - * AM 上传文件接收器 - */ -public class AMUplodReceiver { -} diff --git a/Aria/src/main/java/com/arialyy/aria/core/Aria.java b/Aria/src/main/java/com/arialyy/aria/core/Aria.java index 4aab85f2..9183b797 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/Aria.java +++ b/Aria/src/main/java/com/arialyy/aria/core/Aria.java @@ -26,6 +26,7 @@ import android.app.Service; import android.content.Context; import android.os.Build; import android.widget.PopupWindow; +import com.arialyy.aria.core.receiver.DownloadReceiver; import com.arialyy.aria.core.scheduler.OnSchedulerListener; import com.arialyy.aria.core.task.Task; @@ -36,7 +37,7 @@ import com.arialyy.aria.core.task.Task; *
  *   
  *   //启动下载
- *   Aria.whit(this)
+ *   Aria.download(this)
  *       .load(DOWNLOAD_URL)     //下载地址,必填
  *       //文件保存路径,必填
  *       .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk")
@@ -99,120 +100,48 @@ import com.arialyy.aria.core.task.Task;
   }
 
   /**
-   * 接受Activity、Service、Application
+   * 初始化下载
+   *
+   * @param obj 支持类型有【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】
    */
-  public static AMReceiver whit(Context context) {
-    //if (context == null) throw new IllegalArgumentException("context 不能为 null");
-    checkNull(context);
-    if (context instanceof Activity
-        || context instanceof Service
-        || context instanceof Application) {
-      return AriaManager.getInstance(context).get(context);
-    } else {
-      throw new IllegalArgumentException("这是不支持的context");
-    }
-  }
-
-  /**
-   * 处理Fragment
-   */
-  public static AMReceiver whit(Fragment fragment) {
-    checkNull(fragment);
-    return AriaManager.getInstance(
-        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext()
-            : fragment.getActivity()).get(fragment);
-  }
-
-  /**
-   * 处理Fragment
-   */
-  public static AMReceiver whit(android.support.v4.app.Fragment fragment) {
-    checkNull(fragment);
-    return AriaManager.getInstance(
-        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext()
-            : fragment.getActivity()).get(fragment);
-  }
-
-  /**
-   * 处理Fragment、或者DialogFragment
-   */
-  public static AMReceiver whit(DialogFragment dialog) {
-    checkNull(dialog);
-    return AriaManager.getInstance(
-        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? dialog.getContext() : dialog.getActivity())
-        .get(dialog);
-  }
-
-  /**
-   * 处理popupwindow
-   */
-  public static AMReceiver whit(PopupWindow popupWindow) {
-    checkNull(popupWindow);
-    return AriaManager.getInstance(popupWindow.getContentView().getContext()).get(popupWindow);
-  }
-
-  /**
-   * 处理Dialog
-   */
-  public static AMReceiver whit(Dialog dialog) {
-    checkNull(dialog);
-    return AriaManager.getInstance(dialog.getContext()).get(dialog);
+  public static DownloadReceiver download(Object obj) {
+    return get(obj).download(obj);
   }
 
   /**
    * 处理通用事件
+   *
+   * @param obj 支持类型有【Activity、Service、Application、DialogFragment、Fragment、PopupWindow、Dialog】
    */
-  public static AriaManager get(Context context) {
-    if (context == null) throw new IllegalArgumentException("context 不能为 null");
-    if (context instanceof Activity
-        || context instanceof Service
-        || context instanceof Application) {
-      return AriaManager.getInstance(context);
+  public static AriaManager get(Object obj) {
+    if (obj instanceof Activity || obj instanceof Service || obj instanceof Application) {
+      return AriaManager.getInstance((Context) obj);
+    } else if (obj instanceof DialogFragment) {
+      DialogFragment dialog = (DialogFragment) obj;
+      return AriaManager.getInstance(
+          Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? dialog.getContext()
+              : dialog.getActivity());
+    } else if (obj instanceof android.support.v4.app.Fragment) {
+      android.support.v4.app.Fragment fragment = (android.support.v4.app.Fragment) obj;
+      return AriaManager.getInstance(
+          Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext()
+              : fragment.getActivity());
+    } else if (obj instanceof Fragment) {
+      Fragment fragment = (Fragment) obj;
+      return AriaManager.getInstance(
+          Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext()
+              : fragment.getActivity());
+    } else if (obj instanceof PopupWindow) {
+      PopupWindow popupWindow = (PopupWindow) obj;
+      return AriaManager.getInstance(popupWindow.getContentView().getContext());
+    } else if (obj instanceof Dialog) {
+      Dialog dialog = (Dialog) obj;
+      return AriaManager.getInstance(dialog.getContext());
     } else {
-      throw new IllegalArgumentException("这是不支持的context");
+      throw new IllegalArgumentException("不支持的类型");
     }
   }
 
-  /**
-   * 处理Dialog的通用任务
-   */
-  public static AriaManager get(Dialog dialog) {
-    checkNull(dialog);
-    return AriaManager.getInstance(dialog.getContext());
-  }
-
-  /**
-   * 处理Dialog的通用任务
-   */
-  public static AriaManager get(PopupWindow popupWindow) {
-    checkNull(popupWindow);
-    return AriaManager.getInstance(popupWindow.getContentView().getContext());
-  }
-
-  /**
-   * 处理Fragment的通用任务
-   */
-  public static AriaManager get(Fragment fragment) {
-    checkNull(fragment);
-    return AriaManager.getInstance(
-        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext()
-            : fragment.getActivity());
-  }
-
-  /**
-   * 处理Fragment的通用任务
-   */
-  public static AriaManager get(android.support.v4.app.Fragment fragment) {
-    checkNull(fragment);
-    return AriaManager.getInstance(
-        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? fragment.getContext()
-            : fragment.getActivity());
-  }
-
-  private static void checkNull(Object obj) {
-    if (obj == null) throw new IllegalArgumentException("不能传入空对象");
-  }
-
   public static class SimpleSchedulerListener implements OnSchedulerListener {
 
     @Override public void onTaskPre(Task task) {
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 b9dcb150..eeff3689 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java
@@ -19,7 +19,6 @@ import android.annotation.TargetApi;
 import android.app.Activity;
 import android.app.Application;
 import android.app.Dialog;
-import android.app.Service;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Build;
@@ -29,11 +28,12 @@ import android.support.v4.app.Fragment;
 import android.text.TextUtils;
 import android.util.Log;
 import android.widget.PopupWindow;
-import com.arialyy.aria.core.command.CmdFactory;
+import com.arialyy.aria.core.command.download.CmdFactory;
+import com.arialyy.aria.core.receiver.DownloadReceiver;
 import com.arialyy.aria.util.CAConfiguration;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
-import com.arialyy.aria.core.command.IDownloadCmd;
+import com.arialyy.aria.core.command.download.IDownloadCmd;
 import com.arialyy.aria.util.Configuration;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
@@ -52,7 +52,7 @@ import java.util.Set;
   private static final String TAG = "AriaManager";
   private static final Object LOCK = new Object();
   private static volatile AriaManager INSTANCE = null;
-  private Map mTargets = new HashMap<>();
+  private Map mDownloadTargets = new HashMap<>();
   private DownloadManager mManager;
   private LifeCallback mLifeCallback;
 
@@ -70,8 +70,8 @@ import java.util.Set;
     return INSTANCE;
   }
 
-  AMReceiver get(Object obj) {
-    return getTarget(obj);
+  DownloadReceiver download(Object obj) {
+    return getDownloadTarget(obj);
   }
 
   /**
@@ -115,14 +115,15 @@ import java.util.Set;
   }
 
   /**
-   * 停止所有正在执行的任务
+   * 停止所有正在下载的任务
    */
   public void stopAllTask() {
     List allEntity = mManager.getAllDownloadEntity();
     List stopCmds = new ArrayList<>();
     for (DownloadEntity entity : allEntity) {
       if (entity.getState() == DownloadEntity.STATE_DOWNLOAD_ING) {
-        stopCmds.add(CommonUtil.createCmd(entity, CmdFactory.TASK_STOP));
+        stopCmds.add(
+            CommonUtil.createDownloadCmd(new DownloadTaskEntity(entity), CmdFactory.TASK_STOP));
       }
     }
     mManager.setCmds(stopCmds).exe();
@@ -181,20 +182,21 @@ import java.util.Set;
     List allEntity = mManager.getAllDownloadEntity();
     List cancelCmds = new ArrayList<>();
     for (DownloadEntity entity : allEntity) {
-      cancelCmds.add(CommonUtil.createCmd(entity, CmdFactory.TASK_CANCEL));
+      cancelCmds.add(
+          CommonUtil.createDownloadCmd(new DownloadTaskEntity(entity), CmdFactory.TASK_CANCEL));
     }
     mManager.setCmds(cancelCmds).exe();
-    Set keys = mTargets.keySet();
+    Set keys = mDownloadTargets.keySet();
     for (String key : keys) {
-      AMReceiver target = mTargets.get(key);
+      DownloadReceiver target = mDownloadTargets.get(key);
       target.removeSchedulerListener();
-      mTargets.remove(key);
+      mDownloadTargets.remove(key);
     }
   }
 
-  private AMReceiver putTarget(Object obj) {
+  private DownloadReceiver putTarget(Object obj) {
     String clsName = obj.getClass().getName();
-    AMReceiver target = null;
+    DownloadReceiver target = null;
     String key = "";
     if (!(obj instanceof Activity)) {
       if (obj instanceof android.support.v4.app.Fragment) {
@@ -224,11 +226,11 @@ import java.util.Set;
     if (TextUtils.isEmpty(key)) {
       throw new IllegalArgumentException("未知类型");
     }
-    target = mTargets.get(key);
+    target = mDownloadTargets.get(key);
     if (target == null) {
-      target = new AMReceiver();
+      target = new DownloadReceiver();
       target.targetName = obj.getClass().getName();
-      mTargets.put(key, target);
+      mDownloadTargets.put(key, target);
     }
     return target;
   }
@@ -243,7 +245,7 @@ import java.util.Set;
           (PopupWindow.OnDismissListener) dismissField.get(popupWindow);
       if (listener != null) {
         Log.e(TAG, "你已经对PopupWindow设置了Dismiss事件。为了防止内存泄露,"
-            + "请在dismiss方法中调用Aria.whit(this).removeSchedulerListener();来注销事件");
+            + "请在dismiss方法中调用Aria.download(this).removeSchedulerListener();来注销事件");
       } else {
         popupWindow.setOnDismissListener(createPopupWindowListener(popupWindow));
       }
@@ -276,7 +278,7 @@ import java.util.Set;
         Message cancelMsg = (Message) cancelField.get(dialog);
         if (cancelMsg != null) {
           Log.e(TAG, "你已经对Dialog设置了Dismiss和cancel事件。为了防止内存泄露,"
-              + "请在dismiss方法中调用Aria.whit(this).removeSchedulerListener();来注销事件");
+              + "请在dismiss方法中调用Aria.download(this).removeSchedulerListener();来注销事件");
         } else {
           dialog.setOnCancelListener(createCancelListener());
         }
@@ -288,8 +290,8 @@ import java.util.Set;
     }
   }
 
-  private AMReceiver getTarget(Object obj) {
-    AMReceiver target = mTargets.get(obj.getClass().getName());
+  private DownloadReceiver getDownloadTarget(Object obj) {
+    DownloadReceiver target = mDownloadTargets.get(obj.getClass().getName());
     if (target == null) {
       target = putTarget(obj);
     }
@@ -335,17 +337,15 @@ import java.util.Set;
    * onDestroy
    */
   private void destroySchedulerListener(Object obj) {
-    Set keys = mTargets.keySet();
+    Set keys = mDownloadTargets.keySet();
     String clsName = obj.getClass().getName();
-    for (Iterator> iter = mTargets.entrySet().iterator();
+    for (
+        Iterator> iter = mDownloadTargets.entrySet().iterator();
         iter.hasNext(); ) {
-      Map.Entry entry = iter.next();
+      Map.Entry entry = iter.next();
       String key = entry.getKey();
       if (key.equals(clsName) || key.contains(clsName)) {
-        AMReceiver receiver = mTargets.get(key);
-        if (receiver.obj != null) {
-          if (receiver.obj instanceof Application || receiver.obj instanceof Service) break;
-        }
+        DownloadReceiver receiver = mDownloadTargets.get(key);
         receiver.removeSchedulerListener();
         receiver.destroy();
         iter.remove();
diff --git a/Aria/src/main/java/com/arialyy/aria/core/DownloadManager.java b/Aria/src/main/java/com/arialyy/aria/core/DownloadManager.java
index 12640284..d8119bb8 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/DownloadManager.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/DownloadManager.java
@@ -19,7 +19,7 @@ package com.arialyy.aria.core;
 import android.content.Context;
 import com.arialyy.aria.core.queue.ITaskQueue;
 import com.arialyy.aria.orm.DbUtil;
-import com.arialyy.aria.core.command.IDownloadCmd;
+import com.arialyy.aria.core.command.download.IDownloadCmd;
 import com.arialyy.aria.core.queue.DownloadTaskQueue;
 import com.arialyy.aria.orm.DbEntity;
 import com.arialyy.aria.util.Configuration;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java
new file mode 100644
index 00000000..02517f71
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java
@@ -0,0 +1,19 @@
+package com.arialyy.aria.core;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by Aria.Lao on 2017/1/23.
+ * 下载任务实体
+ */
+public class DownloadTaskEntity {
+
+  public DownloadEntity downloadEntity;
+  public RequestEnum requestEnum = RequestEnum.GET;
+  public Map headers = new HashMap<>();
+
+  public DownloadTaskEntity(DownloadEntity downloadEntity) {
+    this.downloadEntity = downloadEntity;
+  }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/RequestEnum.java b/Aria/src/main/java/com/arialyy/aria/core/RequestEnum.java
index 43423f82..1919a949 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/RequestEnum.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/RequestEnum.java
@@ -7,7 +7,7 @@ package com.arialyy.aria.core;
 public enum RequestEnum {
   GET("GET"), POST("POST");
 
-  String name;
+  public String name;
 
   RequestEnum(String name) {
     this.name = name;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/TaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/TaskEntity.java
deleted file mode 100644
index 0cc6be80..00000000
--- a/Aria/src/main/java/com/arialyy/aria/core/TaskEntity.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.arialyy.aria.core;
-
-/**
- * Created by Aria.Lao on 2017/1/23.
- * 任务实体
- */
-public class TaskEntity {
-  public DownloadEntity downloadEntity;
-  public RequestEnum requestEnum = RequestEnum.GET;
-}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/SingleCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/SingleCmd.java
deleted file mode 100644
index f7bbe04e..00000000
--- a/Aria/src/main/java/com/arialyy/aria/core/command/SingleCmd.java
+++ /dev/null
@@ -1,48 +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.command;
-
-import android.util.Log;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.task.Task;
-
-/**
- * Created by lyy on 2016/11/30.
- * 获取任务状态命令
- */
-class SingleCmd extends IDownloadCmd {
-  /**
-   * @param entity 下载实体
-   */
-  SingleCmd(String target, DownloadEntity entity) {
-    super(target, entity);
-  }
-
-  SingleCmd(DownloadEntity entity) {
-    super(entity);
-  }
-
-  @Override public void executeCmd() {
-    Task task = mQueue.getTask(mEntity);
-    if (task == null) {
-      task = mQueue.createTask(mTargetName, mEntity);
-    } else {
-      Log.w(TAG, "添加命令执行失败,【该任务已经存在】");
-    }
-    task.setTargetName(mTargetName);
-    mQueue.startTask(task);
-  }
-}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/AddCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/download/AddCmd.java
similarity index 79%
rename from Aria/src/main/java/com/arialyy/aria/core/command/AddCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/command/download/AddCmd.java
index 320d916f..3a919edb 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/AddCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/command/download/AddCmd.java
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command;
+package com.arialyy.aria.core.command.download;
 
 import android.util.Log;
 import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.task.Task;
 
 /**
@@ -26,16 +27,16 @@ import com.arialyy.aria.core.task.Task;
  */
 class AddCmd extends IDownloadCmd {
 
-  AddCmd(DownloadEntity entity) {
+  AddCmd(DownloadTaskEntity entity) {
     super(entity);
   }
 
-  AddCmd(String target, DownloadEntity entity) {
-    super(target, entity);
+  AddCmd(String targetName, DownloadTaskEntity entity) {
+    super(targetName, entity);
   }
 
   @Override public void executeCmd() {
-    Task task = mQueue.getTask(mEntity);
+    Task task = mQueue.getTask(mEntity.downloadEntity);
     if (task == null) {
       mQueue.createTask(mTargetName, mEntity);
     } else {
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/CancelCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/download/CancelCmd.java
similarity index 79%
rename from Aria/src/main/java/com/arialyy/aria/core/command/CancelCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/command/download/CancelCmd.java
index 333e03fc..686c1521 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/CancelCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/command/download/CancelCmd.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command;
+package com.arialyy.aria.core.command.download;
 
 import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.task.Task;
 
 /**
@@ -25,16 +26,16 @@ import com.arialyy.aria.core.task.Task;
  */
 class CancelCmd extends IDownloadCmd {
 
-  CancelCmd(String target, DownloadEntity entity) {
-    super(target, entity);
-  }
-
-  CancelCmd(DownloadEntity entity) {
+  CancelCmd(DownloadTaskEntity entity) {
     super(entity);
   }
 
+  CancelCmd(String targetName, DownloadTaskEntity entity) {
+    super(targetName, entity);
+  }
+
   @Override public void executeCmd() {
-    Task task = mQueue.getTask(mEntity);
+    Task task = mQueue.getTask(mEntity.downloadEntity);
     if (task == null) {
       task = mQueue.createTask(mTargetName, mEntity);
     }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/CmdFactory.java b/Aria/src/main/java/com/arialyy/aria/core/command/download/CmdFactory.java
similarity index 80%
rename from Aria/src/main/java/com/arialyy/aria/core/command/CmdFactory.java
rename to Aria/src/main/java/com/arialyy/aria/core/command/download/CmdFactory.java
index 786fb9dc..a6f5f3aa 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/CmdFactory.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/command/download/CmdFactory.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command;
+package com.arialyy.aria.core.command.download;
 
 import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
 
 /**
  * Created by Lyy on 2016/9/23.
@@ -66,7 +67,7 @@ public class CmdFactory {
    * @param type 命令类型{@link #TASK_CREATE}、{@link #TASK_START}、{@link #TASK_CANCEL}、{@link
    * #TASK_STOP}
    */
-  public IDownloadCmd createCmd(DownloadEntity entity, int type) {
+  public IDownloadCmd createCmd(DownloadTaskEntity entity, int type) {
     switch (type) {
       case TASK_CREATE:
         return createAddCmd(entity);
@@ -78,7 +79,7 @@ public class CmdFactory {
       case TASK_STOP:
         return createStopCmd(entity);
       case TASK_SINGLE:
-        return new SingleCmd(entity);
+        //return new SingleCmd(entity);
       default:
         return null;
     }
@@ -90,7 +91,7 @@ public class CmdFactory {
    * @param type 命令类型{@link #TASK_CREATE}、{@link #TASK_START}、{@link #TASK_CANCEL}、{@link
    * #TASK_STOP}
    */
-  public IDownloadCmd createCmd(String target, DownloadEntity entity, int type) {
+  public IDownloadCmd createCmd(String target, DownloadTaskEntity entity, int type) {
     switch (type) {
       case TASK_CREATE:
         return createAddCmd(target, entity);
@@ -102,7 +103,7 @@ public class CmdFactory {
       case TASK_STOP:
         return createStopCmd(target, entity);
       case TASK_SINGLE:
-        return new SingleCmd(target, entity);
+        //return new SingleCmd(target, entity);
       default:
         return null;
     }
@@ -113,7 +114,7 @@ public class CmdFactory {
    *
    * @return {@link StopCmd}
    */
-  private StopCmd createStopCmd(String target, DownloadEntity entity) {
+  private StopCmd createStopCmd(String target, DownloadTaskEntity entity) {
     return new StopCmd(target, entity);
   }
 
@@ -122,7 +123,7 @@ public class CmdFactory {
    *
    * @return {@link StopCmd}
    */
-  private StopCmd createStopCmd(DownloadEntity entity) {
+  private StopCmd createStopCmd(DownloadTaskEntity entity) {
     return new StopCmd(entity);
   }
 
@@ -131,7 +132,7 @@ public class CmdFactory {
    *
    * @return {@link AddCmd}
    */
-  private AddCmd createAddCmd(String target, DownloadEntity entity) {
+  private AddCmd createAddCmd(String target, DownloadTaskEntity entity) {
     return new AddCmd(target, entity);
   }
 
@@ -140,7 +141,7 @@ public class CmdFactory {
    *
    * @return {@link AddCmd}
    */
-  private AddCmd createAddCmd(DownloadEntity entity) {
+  private AddCmd createAddCmd(DownloadTaskEntity entity) {
     return new AddCmd(entity);
   }
 
@@ -149,7 +150,7 @@ public class CmdFactory {
    *
    * @return {@link StartCmd}
    */
-  private StartCmd createStartCmd(String target, DownloadEntity entity) {
+  private StartCmd createStartCmd(String target, DownloadTaskEntity entity) {
     return new StartCmd(target, entity);
   }
 
@@ -158,7 +159,7 @@ public class CmdFactory {
    *
    * @return {@link StartCmd}
    */
-  private StartCmd createStartCmd(DownloadEntity entity) {
+  private StartCmd createStartCmd(DownloadTaskEntity entity) {
     return new StartCmd(entity);
   }
 
@@ -167,7 +168,7 @@ public class CmdFactory {
    *
    * @return {@link CancelCmd}
    */
-  private CancelCmd createCancelCmd(String target, DownloadEntity entity) {
+  private CancelCmd createCancelCmd(String target, DownloadTaskEntity entity) {
     return new CancelCmd(target, entity);
   }
 
@@ -176,7 +177,7 @@ public class CmdFactory {
    *
    * @return {@link CancelCmd}
    */
-  private CancelCmd createCancelCmd(DownloadEntity entity) {
+  private CancelCmd createCancelCmd(DownloadTaskEntity entity) {
     return new CancelCmd(entity);
   }
 }
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/IDownloadCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java
similarity index 82%
rename from Aria/src/main/java/com/arialyy/aria/core/command/IDownloadCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java
index 0bd6a313..f9bb1bd7 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/IDownloadCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command;
+package com.arialyy.aria.core.command.download;
 
 import com.arialyy.aria.core.DownloadManager;
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.queue.ITaskQueue;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
@@ -28,22 +29,22 @@ import com.arialyy.aria.core.DownloadEntity;
  */
 public abstract class IDownloadCmd {
   ITaskQueue mQueue;
-  DownloadEntity mEntity;
+  DownloadTaskEntity mEntity;
   String TAG;
   String mTargetName;
 
   /**
    * @param entity 下载实体
    */
-  IDownloadCmd(DownloadEntity entity) {
+  IDownloadCmd(DownloadTaskEntity entity) {
     this(null, entity);
   }
 
   /**
    * @param targetName 产生任务的对象名
    */
-  IDownloadCmd(String targetName, DownloadEntity entity) {
-    if (!CheckUtil.checkDownloadEntity(entity)) {
+  IDownloadCmd(String targetName, DownloadTaskEntity entity) {
+    if (!CheckUtil.checkDownloadEntity(entity.downloadEntity)) {
       return;
     }
     mTargetName = targetName;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/download/SingleCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/download/SingleCmd.java
new file mode 100644
index 00000000..d9eb246e
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/command/download/SingleCmd.java
@@ -0,0 +1,48 @@
+///*
+// * 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.command.download;
+//
+//import android.util.Log;
+//import com.arialyy.aria.core.DownloadEntity;
+//import com.arialyy.aria.core.task.Task;
+//
+///**
+// * Created by lyy on 2016/11/30.
+// * 获取任务状态命令
+// */
+//class SingleCmd extends IDownloadCmd {
+//  /**
+//   * @param entity 下载实体
+//   */
+//  SingleCmd(String target, DownloadEntity entity) {
+//    super(target, entity);
+//  }
+//
+//  SingleCmd(DownloadEntity entity) {
+//    super(entity);
+//  }
+//
+//  @Override public void executeCmd() {
+//    Task task = mQueue.getTask(mEntity);
+//    if (task == null) {
+//      task = mQueue.createTask(mTargetName, mEntity);
+//    } else {
+//      Log.w(TAG, "添加命令执行失败,【该任务已经存在】");
+//    }
+//    task.setTargetName(mTargetName);
+//    mQueue.startTask(task);
+//  }
+//}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/StartCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/download/StartCmd.java
similarity index 79%
rename from Aria/src/main/java/com/arialyy/aria/core/command/StartCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/command/download/StartCmd.java
index 11c2dfc2..038df58e 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/StartCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/command/download/StartCmd.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command;
+package com.arialyy.aria.core.command.download;
 
 import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.task.Task;
 
 /**
@@ -25,16 +26,16 @@ import com.arialyy.aria.core.task.Task;
  */
 class StartCmd extends IDownloadCmd {
 
-  StartCmd(String target, DownloadEntity entity) {
-    super(target, entity);
-  }
-
-  StartCmd(DownloadEntity entity) {
+  StartCmd(DownloadTaskEntity entity) {
     super(entity);
   }
 
+  StartCmd(String targetName, DownloadTaskEntity entity) {
+    super(targetName, entity);
+  }
+
   @Override public void executeCmd() {
-    Task task = mQueue.getTask(mEntity);
+    Task task = mQueue.getTask(mEntity.downloadEntity);
     if (task == null) {
       task = mQueue.createTask(mTargetName, mEntity);
     }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/StopCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/download/StopCmd.java
similarity index 78%
rename from Aria/src/main/java/com/arialyy/aria/core/command/StopCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/command/download/StopCmd.java
index 676e8da7..1ec50551 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/StopCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/command/download/StopCmd.java
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command;
+package com.arialyy.aria.core.command.download;
 
 import android.text.TextUtils;
 import android.util.Log;
 import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.task.Task;
 
 /**
@@ -27,21 +28,18 @@ import com.arialyy.aria.core.task.Task;
  */
 class StopCmd extends IDownloadCmd {
 
-  /**
-   * @param entity 下载实体
-   */
-  StopCmd(String target, DownloadEntity entity) {
-    super(target, entity);
-  }
-
-  StopCmd(DownloadEntity entity) {
+  StopCmd(DownloadTaskEntity entity) {
     super(entity);
   }
 
+  StopCmd(String targetName, DownloadTaskEntity entity) {
+    super(targetName, entity);
+  }
+
   @Override public void executeCmd() {
-    Task task = mQueue.getTask(mEntity);
+    Task task = mQueue.getTask(mEntity.downloadEntity);
     if (task == null) {
-      if (mEntity.getState() == DownloadEntity.STATE_DOWNLOAD_ING) {
+      if (mEntity.downloadEntity.getState() == DownloadEntity.STATE_DOWNLOAD_ING) {
         task = mQueue.createTask(mTargetName, mEntity);
         mQueue.stopTask(task);
       } else {
diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java
index de033a65..52dc5e0f 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java
@@ -20,10 +20,10 @@ import android.content.Context;
 import android.text.TextUtils;
 import android.util.Log;
 import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.queue.pool.CachePool;
 import com.arialyy.aria.core.queue.pool.ExecutePool;
 import com.arialyy.aria.core.scheduler.DownloadSchedulers;
-import com.arialyy.aria.core.scheduler.IDownloadSchedulers;
 import com.arialyy.aria.core.task.Task;
 import com.arialyy.aria.core.task.TaskFactory;
 import com.arialyy.aria.util.Configuration;
@@ -146,7 +146,7 @@ public class DownloadTaskQueue implements ITaskQueue {
     }
   }
 
-  @Override public Task createTask(String target, DownloadEntity entity) {
+  @Override public Task createTask(String target, DownloadTaskEntity entity) {
     Task task;
     if (TextUtils.isEmpty(target)) {
       task =
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 68576119..58ad3260 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
@@ -17,6 +17,7 @@
 package com.arialyy.aria.core.queue;
 
 import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.scheduler.IDownloadSchedulers;
 import com.arialyy.aria.core.task.Task;
 
@@ -46,11 +47,11 @@ public interface ITaskQueue extends IDownloader {
   /**
    * 创建一个新的下载任务,创建时只是将新任务存储到缓存池
    *
-   * @param entity 下载实体{@link DownloadEntity}
+   * @param entity 下载实体{@link DownloadTaskEntity}
    * @param targetName 生成该任务的对象
    * @return {@link Task}
    */
-  public Task createTask(String targetName, DownloadEntity entity);
+  public Task createTask(String targetName, DownloadTaskEntity entity);
 
   /**
    * 通过下载链接从缓存池或任务池搜索下载任务,如果缓存池或任务池都没有任务,则创建新任务
diff --git a/Aria/src/main/java/com/arialyy/aria/core/AMReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/receiver/DownloadReceiver.java
similarity index 82%
rename from Aria/src/main/java/com/arialyy/aria/core/AMReceiver.java
rename to Aria/src/main/java/com/arialyy/aria/core/receiver/DownloadReceiver.java
index 5ae43a1a..5ba5e251 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/AMReceiver.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/receiver/DownloadReceiver.java
@@ -13,9 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core;
+package com.arialyy.aria.core.receiver;
 
 import android.support.annotation.NonNull;
+import com.arialyy.aria.core.AMTarget;
+import com.arialyy.aria.core.DownloadEntity;
 import com.arialyy.aria.core.scheduler.DownloadSchedulers;
 import com.arialyy.aria.core.scheduler.OnSchedulerListener;
 import com.arialyy.aria.util.CheckUtil;
@@ -24,10 +26,9 @@ import com.arialyy.aria.util.CheckUtil;
  * Created by lyy on 2016/12/5.
  * AM 接收器
  */
-public class AMReceiver {
-  String              targetName;
-  OnSchedulerListener listener;
-  Object              obj;
+public class DownloadReceiver {
+  public String targetName;
+  public OnSchedulerListener listener;
 
   /**
    * {@link #load(String)},请使用该方法
@@ -53,7 +54,7 @@ public class AMReceiver {
   /**
    * 添加调度器回调
    */
-  public AMReceiver addSchedulerListener(OnSchedulerListener listener) {
+  public DownloadReceiver addSchedulerListener(OnSchedulerListener listener) {
     this.listener = listener;
     DownloadSchedulers.getInstance().addSchedulerListener(targetName, listener);
     return this;
@@ -62,14 +63,14 @@ public class AMReceiver {
   /**
    * 移除回调
    */
-  public AMReceiver removeSchedulerListener() {
+  public DownloadReceiver removeSchedulerListener() {
     if (listener != null) {
       DownloadSchedulers.getInstance().removeSchedulerListener(targetName, listener);
     }
     return this;
   }
 
-  void destroy() {
+  public void destroy() {
     targetName = null;
     listener = null;
   }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/receiver/IReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/receiver/IReceiver.java
new file mode 100644
index 00000000..bf25c280
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/receiver/IReceiver.java
@@ -0,0 +1,24 @@
+/*
+ * 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.receiver;
+
+/**
+ * Created by Aria.Lao on 2017/2/6.
+ */
+
+public interface IReceiver {
+
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/receiver/UploadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/receiver/UploadReceiver.java
new file mode 100644
index 00000000..cc3329a7
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/receiver/UploadReceiver.java
@@ -0,0 +1,24 @@
+/*
+ * 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.receiver;
+
+/**
+ * Created by Aria.Lao on 2017/2/6.
+ */
+
+public class UploadReceiver implements IReceiver {
+
+}
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java b/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java
index 8d264d5a..bf0b44e9 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java
@@ -15,6 +15,7 @@
  */
 package com.arialyy.aria.core.task;
 
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.util.CAConfiguration;
 import com.arialyy.aria.util.SSLContextUtil;
 import java.io.IOException;
@@ -22,6 +23,7 @@ import java.net.HttpURLConnection;
 import java.net.ProtocolException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.Set;
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSocketFactory;
@@ -60,8 +62,15 @@ class ConnectionHelp {
    *
    * @throws ProtocolException
    */
-  static HttpURLConnection setConnectParam(HttpURLConnection conn) throws ProtocolException {
-    conn.setRequestMethod("GET");
+  static HttpURLConnection setConnectParam(DownloadTaskEntity entity, HttpURLConnection conn)
+      throws ProtocolException {
+    conn.setRequestMethod(entity.requestEnum.name);
+    if (entity.headers != null && entity.headers.size() > 0) {
+      Set keys = entity.headers.keySet();
+      for (String key : keys) {
+        conn.setRequestProperty(key, entity.headers.get(key));
+      }
+    }
     conn.setRequestProperty("Charset", "UTF-8");
     conn.setRequestProperty("User-Agent",
         "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java
index 21c8af7c..b38db976 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java
@@ -20,6 +20,8 @@ import android.content.Context;
 import android.util.Log;
 import android.util.SparseArray;
 import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
+import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
 import java.io.File;
 import java.io.IOException;
@@ -48,20 +50,23 @@ final class DownloadUtil implements IDownloadUtil, Runnable {
   private boolean isSupportBreakpoint = true;
   private Context mContext;
   private DownloadEntity mDownloadEntity;
+  private DownloadTaskEntity mDownloadTaskEntity;
   private ExecutorService mFixedThreadPool;
   private File mDownloadFile; //下载的文件
   private File mConfigFile;//下载信息配置文件
   private SparseArray mTask = new SparseArray<>();
   private DownloadStateConstance mConstance;
 
-  DownloadUtil(Context context, DownloadEntity entity, IDownloadListener downloadListener) {
+  DownloadUtil(Context context, DownloadTaskEntity entity, IDownloadListener downloadListener) {
     this(context, entity, downloadListener, 3);
   }
 
-  DownloadUtil(Context context, DownloadEntity entity, IDownloadListener downloadListener,
+  DownloadUtil(Context context, DownloadTaskEntity entity, IDownloadListener downloadListener,
       int threadNum) {
+    CheckUtil.checkDownloadEntity(entity.downloadEntity);
+    mDownloadEntity = entity.downloadEntity;
     mContext = context.getApplicationContext();
-    mDownloadEntity = entity;
+    mDownloadTaskEntity = entity;
     mListener = downloadListener;
     THREAD_NUM = threadNum;
     mFixedThreadPool = Executors.newFixedThreadPool(Integer.MAX_VALUE);
@@ -70,7 +75,7 @@ final class DownloadUtil implements IDownloadUtil, Runnable {
   }
 
   private void init() {
-    mDownloadFile = new File(mDownloadEntity.getDownloadPath());
+    mDownloadFile = new File(mDownloadTaskEntity.downloadEntity.getDownloadPath());
     //读取已完成的线程数
     mConfigFile = new File(
         mContext.getFilesDir().getPath() + "/temp/" + mDownloadFile.getName() + ".properties");
@@ -196,7 +201,7 @@ final class DownloadUtil implements IDownloadUtil, Runnable {
     try {
       URL url = new URL(mDownloadEntity.getDownloadUrl());
       HttpURLConnection conn = ConnectionHelp.handleConnection(url);
-      conn = ConnectionHelp.setConnectParam(conn);
+      conn = ConnectionHelp.setConnectParam(mDownloadTaskEntity, conn);
       conn.setRequestProperty("Range", "bytes=" + 0 + "-");
       conn.setConnectTimeout(mConnectTimeOut * 4);
       conn.connect();
@@ -251,6 +256,7 @@ final class DownloadUtil implements IDownloadUtil, Runnable {
       entity.END_LOCATION = entity.FILE_SIZE;
       entity.CONFIG_FILE_PATH = mConfigFile.getPath();
       entity.isSupportBreakpoint = isSupportBreakpoint;
+      entity.DOWNLOAD_TASK_ENTITY = mDownloadTaskEntity;
       SingleThreadTask task = new SingleThreadTask(mConstance, mListener, entity);
       mFixedThreadPool.execute(task);
       mListener.onStart(0);
@@ -336,6 +342,7 @@ final class DownloadUtil implements IDownloadUtil, Runnable {
       entity.END_LOCATION = endL;
       entity.CONFIG_FILE_PATH = mConfigFile.getPath();
       entity.isSupportBreakpoint = isSupportBreakpoint;
+      entity.DOWNLOAD_TASK_ENTITY = mDownloadTaskEntity;
       SingleThreadTask task = new SingleThreadTask(mConstance, mListener, entity);
       mTask.put(i, task);
     }
@@ -366,5 +373,6 @@ final class DownloadUtil implements IDownloadUtil, Runnable {
     File TEMP_FILE;
     boolean isSupportBreakpoint = true;
     String CONFIG_FILE_PATH;
+    DownloadTaskEntity DOWNLOAD_TASK_ENTITY;
   }
 }
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java
index d305d98c..2f6afc82 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java
@@ -70,7 +70,7 @@ final class SingleThreadTask implements Runnable {
       } else {
         Log.w(TAG, "该下载不支持断点,即将重新下载");
       }
-      conn = ConnectionHelp.setConnectParam(conn);
+      conn = ConnectionHelp.setConnectParam(mConfigEntity.DOWNLOAD_TASK_ENTITY, conn);
       conn.setConnectTimeout(mConstance.CONNECT_TIME_OUT);
       conn.setReadTimeout(mConstance.READ_TIME_OUT);  //设置读取流的等待时间,必须设置该参数
       is = conn.getInputStream();
@@ -87,7 +87,6 @@ final class SingleThreadTask implements Runnable {
           break;
         }
         if (mConstance.isStop) {
-          Log.i(TAG, "stop");
           break;
         }
         //把下载数据数据写入文件
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/Task.java b/Aria/src/main/java/com/arialyy/aria/core/task/Task.java
index 016ab8ef..5f930cb3 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/Task.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/task/Task.java
@@ -21,11 +21,11 @@ import android.content.Intent;
 import android.os.Handler;
 import android.util.Log;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.DownloadManager;
-import com.arialyy.aria.core.TaskEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.scheduler.DownloadSchedulers;
 import com.arialyy.aria.core.scheduler.IDownloadSchedulers;
 import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
 import com.arialyy.aria.util.Configuration;
 import java.lang.ref.WeakReference;
@@ -39,23 +39,25 @@ public class Task {
   /**
    * 产生该任务对象的hash码
    */
-  private String            mTargetName;
-  private DownloadEntity    mEntity;
+  private String mTargetName;
+  private DownloadEntity mEntity;
+  private DownloadTaskEntity mTaskEntity;
   private IDownloadListener mListener;
-  private Handler           mOutHandler;
-  private Context           mContext;
-  private IDownloadUtil     mUtil;
+  private Handler mOutHandler;
+  private Context mContext;
+  private IDownloadUtil mUtil;
 
-  private Task(Context context, DownloadEntity entity, Handler outHandler) {
+  private Task(Context context, DownloadTaskEntity taskEntity, Handler outHandler) {
     mContext = context.getApplicationContext();
-    mEntity = entity;
+    mTaskEntity = taskEntity;
+    mEntity = taskEntity.downloadEntity;
     mOutHandler = outHandler;
     init();
   }
 
   private void init() {
     mListener = new DListener(mContext, this, mOutHandler);
-    mUtil = new DownloadUtil(mContext, mEntity, mListener);
+    mUtil = new DownloadUtil(mContext, mTaskEntity, mListener);
   }
 
   /**
@@ -162,21 +164,21 @@ public class Task {
   }
 
   static class Builder {
-    DownloadEntity downloadEntity;
-    Handler        outHandler;
-    Context        context;
+    DownloadTaskEntity taskEntity;
+    Handler outHandler;
+    Context context;
     int threadNum = 3;
-    String        targetName;
-    IDownloadUtil downloadUtil;
+    String targetName;
 
-    public Builder(Context context, DownloadEntity downloadEntity) {
+    public Builder(Context context, DownloadTaskEntity downloadEntity) {
       this("", context, downloadEntity);
     }
 
-    Builder(String targetName, Context context, DownloadEntity downloadEntity) {
+    Builder(String targetName, Context context, DownloadTaskEntity taskEntity) {
+      CheckUtil.checkDownloadEntity(taskEntity.downloadEntity);
       this.targetName = targetName;
       this.context = context;
-      this.downloadEntity = downloadEntity;
+      this.taskEntity = taskEntity;
     }
 
     /**
@@ -198,9 +200,9 @@ public class Task {
     }
 
     public Task build() {
-      Task task = new Task(context, downloadEntity, outHandler);
+      Task task = new Task(context, taskEntity, outHandler);
       task.setTargetName(targetName);
-      downloadEntity.save();
+      taskEntity.downloadEntity.save();
       return task;
     }
   }
@@ -210,16 +212,16 @@ public class Task {
    */
   private static class DListener extends DownloadListener {
     WeakReference outHandler;
-    WeakReference    wTask;
-    Context                context;
-    Intent                 sendIntent;
-    long    INTERVAL      = 1024 * 10;   //10k大小的间隔
-    long    lastLen       = 0;   //上一次发送长度
-    long    lastTime      = 0;
-    long    INTERVAL_TIME = 1000;   //1m更新周期
-    boolean isFirst       = true;
+    WeakReference wTask;
+    Context context;
+    Intent sendIntent;
+    long INTERVAL = 1024 * 10;   //10k大小的间隔
+    long lastLen = 0;   //上一次发送长度
+    long lastTime = 0;
+    long INTERVAL_TIME = 1000;   //1m更新周期
+    boolean isFirst = true;
     DownloadEntity downloadEntity;
-    Task           task;
+    Task task;
 
     DListener(Context context, Task task, Handler outHandler) {
       this.context = context;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/TaskFactory.java b/Aria/src/main/java/com/arialyy/aria/core/task/TaskFactory.java
index 8cc1b710..a27217fb 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/TaskFactory.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/task/TaskFactory.java
@@ -17,7 +17,7 @@
 package com.arialyy.aria.core.task;
 
 import android.content.Context;
-import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.scheduler.IDownloadSchedulers;
 
 /**
@@ -27,7 +27,7 @@ import com.arialyy.aria.core.scheduler.IDownloadSchedulers;
 public class TaskFactory {
   private static final String TAG = "TaskFactory";
 
-  private static final    Object      LOCK     = new Object();
+  private static final Object LOCK = new Object();
   private static volatile TaskFactory INSTANCE = null;
 
   private TaskFactory() {
@@ -46,14 +46,19 @@ public class TaskFactory {
   /**
    * 创建普通下载任务
    *
-   * @param entity 下载实体
+   * @param entity 下载任务实体{@link DownloadTaskEntity}
    * @param schedulers {@link IDownloadSchedulers}
    */
-  public Task createTask(Context context, DownloadEntity entity, IDownloadSchedulers schedulers) {
+  public Task createTask(Context context, DownloadTaskEntity entity,
+      IDownloadSchedulers schedulers) {
     return createTask("", context, entity, schedulers);
   }
 
-  public Task createTask(String targetName, Context context, DownloadEntity entity,
+  /**
+   * @param entity 下载任务实体{@link DownloadTaskEntity}
+   * @param schedulers {@link IDownloadSchedulers}
+   */
+  public Task createTask(String targetName, Context context, DownloadTaskEntity entity,
       IDownloadSchedulers schedulers) {
     Task.Builder builder = new Task.Builder(targetName, context, entity);
     builder.setOutHandler(schedulers);
diff --git a/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java
index 5326a0a6..16ba16ba 100644
--- a/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java
+++ b/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java
@@ -31,6 +31,13 @@ import java.util.regex.Pattern;
 public class CheckUtil {
   private static final String TAG = "CheckUtil";
 
+  /**
+   * 判空
+   */
+  public static void checkNull(Object obj) {
+    if (obj == null) throw new IllegalArgumentException("不能传入空对象");
+  }
+
   /**
    * 检查sql的expression是否合法
    */
@@ -47,14 +54,14 @@ public class CheckUtil {
     }
     Pattern pattern = Pattern.compile("\\?");
     Matcher matcher = pattern.matcher(where);
-    int     count   = 0;
+    int count = 0;
     while (matcher.find()) {
       count++;
     }
-    if (count < expression.length - 1){
+    if (count < expression.length - 1) {
       throw new IllegalArgumentException("条件语句的?个数不能小于参数个数");
     }
-    if (count > expression.length - 1){
+    if (count > expression.length - 1) {
       throw new IllegalArgumentException("条件语句的?个数不能大于参数个数");
     }
   }
@@ -90,7 +97,7 @@ public class CheckUtil {
       fileName = fileName.replace(" ", "_");
     }
     String dPath = entity.getDownloadPath();
-    File   file  = new File(dPath);
+    File file = new File(dPath);
     if (file.isDirectory()) {
       dPath += fileName;
       entity.setDownloadPath(dPath);
diff --git a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java
index 3031b232..e640883e 100644
--- a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java
+++ b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java
@@ -21,9 +21,10 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.net.Uri;
 import android.util.Log;
-import com.arialyy.aria.core.command.CmdFactory;
+import com.arialyy.aria.core.DownloadTaskEntity;
+import com.arialyy.aria.core.command.download.CmdFactory;
 import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.command.IDownloadCmd;
+import com.arialyy.aria.core.command.download.IDownloadCmd;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -40,11 +41,11 @@ import java.util.Properties;
 public class CommonUtil {
   private static final String TAG = "util";
 
-  public static IDownloadCmd createCmd(String target, DownloadEntity entity, int cmd) {
+  public static IDownloadCmd createDownloadCmd(String target, DownloadTaskEntity entity, int cmd) {
     return CmdFactory.getInstance().createCmd(target, entity, cmd);
   }
 
-  public static IDownloadCmd createCmd(DownloadEntity entity, int cmd) {
+  public static IDownloadCmd createDownloadCmd(DownloadTaskEntity entity, int cmd) {
     return CmdFactory.getInstance().createCmd(entity, cmd);
   }
 
diff --git a/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java b/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java
index 8f6db116..be9d1e87 100644
--- a/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java
+++ b/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java
@@ -41,11 +41,11 @@ public class DownloadDialog extends AbsDialog {
 
   private void init() {
     if (Aria.get(this).taskExists(DOWNLOAD_URL)) {
-      AMTarget target = Aria.whit(this).load(DOWNLOAD_URL);
+      AMTarget target = Aria.download(this).load(DOWNLOAD_URL);
       int      p      = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
       mPb.setProgress(p);
     }
-    Aria.whit(this).addSchedulerListener(new MyDialogDownloadCallback());
+    Aria.download(this).addSchedulerListener(new MyDialogDownloadCallback());
     DownloadEntity entity = Aria.get(this).getDownloadEntity(DOWNLOAD_URL);
     if (entity != null) {
       mSize.setText(CommonUtil.formatFileSize(entity.getFileSize()));
@@ -59,17 +59,17 @@ public class DownloadDialog extends AbsDialog {
   @OnClick({ R.id.start, R.id.stop, R.id.cancel }) public void onClick(View view) {
     switch (view.getId()) {
       case R.id.start:
-        Aria.whit(this)
+        Aria.download(this)
             .load(DOWNLOAD_URL)
             .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/daialog.apk")
             .setDownloadName("daialog.apk")
             .start();
         break;
       case R.id.stop:
-        Aria.whit(this).load(DOWNLOAD_URL).stop();
+        Aria.download(this).load(DOWNLOAD_URL).stop();
         break;
       case R.id.cancel:
-        Aria.whit(this).load(DOWNLOAD_URL).cancel();
+        Aria.download(this).load(DOWNLOAD_URL).cancel();
         break;
     }
   }
diff --git a/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java b/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java
index 19502277..44bf2faa 100644
--- a/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java
+++ b/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java
@@ -33,7 +33,7 @@ public class DownloadFragment extends AbsFragment {
 
   @Override protected void init(Bundle savedInstanceState) {
     if (Aria.get(this).taskExists(DOWNLOAD_URL)) {
-      AMTarget target = Aria.whit(this).load(DOWNLOAD_URL);
+      AMTarget target = Aria.download(this).load(DOWNLOAD_URL);
       int      p      = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
       mPb.setProgress(p);
     }
@@ -49,23 +49,23 @@ public class DownloadFragment extends AbsFragment {
 
   @Override public void onResume() {
     super.onResume();
-    Aria.whit(this).addSchedulerListener(new DownloadFragment.MyDialogDownloadCallback());
+    Aria.download(this).addSchedulerListener(new DownloadFragment.MyDialogDownloadCallback());
   }
 
   @OnClick({ R.id.start, R.id.stop, R.id.cancel }) public void onClick(View view) {
     switch (view.getId()) {
       case R.id.start:
-        Aria.whit(this)
+        Aria.download(this)
             .load(DOWNLOAD_URL)
             .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/daialog.apk")
             .setDownloadName("daialog.apk")
             .start();
         break;
       case R.id.stop:
-        Aria.whit(this).load(DOWNLOAD_URL).stop();
+        Aria.download(this).load(DOWNLOAD_URL).stop();
         break;
       case R.id.cancel:
-        Aria.whit(this).load(DOWNLOAD_URL).cancel();
+        Aria.download(this).load(DOWNLOAD_URL).cancel();
         break;
     }
   }
diff --git a/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java b/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java
index 7e6652e4..74402096 100644
--- a/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java
@@ -36,7 +36,7 @@ public class DownloadActivity extends BaseActivity {
 
   @Override protected void onResume() {
     super.onResume();
-    Aria.whit(this).addSchedulerListener(new MySchedulerListener());
+    Aria.download(this).addSchedulerListener(new MySchedulerListener());
   }
 
   private class MySchedulerListener extends Aria.SimpleSchedulerListener {
diff --git a/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java b/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java
index 4ee18fde..75494f48 100644
--- a/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java
+++ b/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java
@@ -142,7 +142,7 @@ final class DownloadAdapter extends AbsRVAdapter {
 
   @Override protected void onResume() {
     super.onResume();
-    Aria.whit(this).addSchedulerListener(new DownloadListener());
+    Aria.download(this).addSchedulerListener(new DownloadListener());
   }
 
   @Override protected void onDestroy() {
diff --git a/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java b/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java
index 3d11fd69..b71ca512 100644
--- a/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java
+++ b/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java
@@ -6,8 +6,6 @@ import android.os.Environment;
 import android.support.v4.app.NotificationCompat;
 import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.task.Task;
-import com.arialyy.frame.util.show.L;
-import com.arialyy.frame.util.show.T;
 import com.arialyy.simple.R;
 
 /**
@@ -36,11 +34,11 @@ public class SimpleNotification {
         .setProgress(100, 0, false)
         .setSmallIcon(R.mipmap.ic_launcher);
     mManager.notify(mNotifiyId, mBuilder.build());
-    Aria.whit(mContext).addSchedulerListener(new DownloadCallback(mBuilder, mManager));
+    Aria.download(mContext).addSchedulerListener(new DownloadCallback(mBuilder, mManager));
   }
 
   public void start() {
-    Aria.whit(mContext)
+    Aria.download(mContext)
         .load(DOWNLOAD_URL)
         .setDownloadName("notification_test.apk")
         .setDownloadPath(
@@ -49,7 +47,7 @@ public class SimpleNotification {
   }
 
   public void stop() {
-    Aria.whit(mContext).load(DOWNLOAD_URL).stop();
+    Aria.download(mContext).load(DOWNLOAD_URL).stop();
   }
 
   private static class DownloadCallback extends Aria.SimpleSchedulerListener {
diff --git a/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java b/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java
index 444d6767..926a8dfe 100644
--- a/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java
+++ b/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java
@@ -43,11 +43,11 @@ public class DownloadPopupWindow extends AbsPopupWindow {
 
   private void initWidget() {
     if (Aria.get(this).taskExists(DOWNLOAD_URL)) {
-      AMTarget target = Aria.whit(this).load(DOWNLOAD_URL);
+      AMTarget target = Aria.download(this).load(DOWNLOAD_URL);
       int      p      = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
       mPb.setProgress(p);
     }
-    Aria.whit(this).addSchedulerListener(new MyDialogDownloadCallback());
+    Aria.download(this).addSchedulerListener(new MyDialogDownloadCallback());
     DownloadEntity entity = Aria.get(this).getDownloadEntity(DOWNLOAD_URL);
     if (entity != null) {
       mSize.setText(CommonUtil.formatFileSize(entity.getFileSize()));
@@ -61,17 +61,17 @@ public class DownloadPopupWindow extends AbsPopupWindow {
   @OnClick({ R.id.start, R.id.stop, R.id.cancel }) public void onClick(View view) {
     switch (view.getId()) {
       case R.id.start:
-        Aria.whit(this)
+        Aria.download(this)
             .load(DOWNLOAD_URL)
             .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/daialog.apk")
             .setDownloadName("daialog.apk")
             .start();
         break;
       case R.id.stop:
-        Aria.whit(this).load(DOWNLOAD_URL).stop();
+        Aria.download(this).load(DOWNLOAD_URL).stop();
         break;
       case R.id.cancel:
-        Aria.whit(this).load(DOWNLOAD_URL).cancel();
+        Aria.download(this).load(DOWNLOAD_URL).cancel();
         break;
     }
   }
diff --git a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java
index 82d62924..8915bb54 100644
--- a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java
+++ b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java
@@ -139,7 +139,7 @@ public class SingleTaskActivity extends BaseActivity {
 
   @Override protected void onResume() {
     super.onResume();
-    Aria.whit(this).addSchedulerListener(new MySchedulerListener());
+    Aria.download(this).addSchedulerListener(new MySchedulerListener());
     //registerReceiver(mReceiver, getModule(DownloadModule.class).getDownloadFilter());
   }
 
@@ -162,7 +162,7 @@ public class SingleTaskActivity extends BaseActivity {
 
   private void init() {
     if (Aria.get(this).taskExists(DOWNLOAD_URL)) {
-      AMTarget target = Aria.whit(this).load(DOWNLOAD_URL);
+      AMTarget target = Aria.download(this).load(DOWNLOAD_URL);
       int      p      = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
       mPb.setProgress(p);
     }
@@ -188,11 +188,11 @@ public class SingleTaskActivity extends BaseActivity {
   }
 
   private void resume() {
-    Aria.whit(this).load(DOWNLOAD_URL).resume();
+    Aria.download(this).load(DOWNLOAD_URL).resume();
   }
 
   private void start() {
-    Aria.whit(this)
+    Aria.download(this)
         .load(DOWNLOAD_URL)
         .setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk")
         .setDownloadName("test.apk")
@@ -200,11 +200,11 @@ public class SingleTaskActivity extends BaseActivity {
   }
 
   private void stop() {
-    Aria.whit(this).load(DOWNLOAD_URL).stop();
+    Aria.download(this).load(DOWNLOAD_URL).stop();
   }
 
   private void cancel() {
-    Aria.whit(this).load(DOWNLOAD_URL).cancel();
+    Aria.download(this).load(DOWNLOAD_URL).cancel();
   }
 
   private class MySchedulerListener extends Aria.SimpleSchedulerListener {

From 90c7cd78ff5d1ee4f5980cca92afdba282797c48 Mon Sep 17 00:00:00 2001
From: AriaLyy <511455842@qq.com>
Date: Tue, 7 Feb 2017 17:33:03 +0800
Subject: [PATCH 02/37] =?UTF-8?q?AriaManager=20=E9=80=BB=E8=BE=91=E9=87=8D?=
 =?UTF-8?q?=E5=86=99=EF=BC=8Capi=E6=8E=A5=E5=8F=A3=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../main/java/com/arialyy/aria/core/Aria.java |   1 -
 .../com/arialyy/aria/core/AriaManager.java    | 276 +++++++-----------
 .../arialyy/aria/core/DownloadManager.java    | 107 -------
 .../arialyy/aria/core/DownloadReceiver.java   | 141 +++++++++
 .../{AMTarget.java => DownloadTarget.java}    |  36 ++-
 .../arialyy/aria/core/DownloadTaskEntity.java |  15 +
 .../aria/core/{receiver => }/IReceiver.java   |  13 +-
 .../com/arialyy/aria/core/RequestEnum.java    |  17 +-
 .../core/{receiver => }/UploadReceiver.java   |  11 +-
 .../arialyy/aria/core/WidgetLiftManager.java  | 111 +++++++
 .../core/command/download/IDownloadCmd.java   |   5 +-
 .../aria/core/receiver/DownloadReceiver.java  |  77 -----
 .../core/scheduler/DownloadSchedulers.java    |   6 +-
 .../com/arialyy/aria/util/Configuration.java  |   4 +-
 .../com/arialyy/aria/util/SSLContextUtil.java |   9 +-
 .../arialyy/simple/base/BaseApplication.java  |   2 -
 .../simple/dialog_task/DownloadDialog.java    |   8 +-
 .../fragment_task/DownloadFragment.java       |   8 +-
 .../arialyy/simple/module/DownloadModule.java |   2 +-
 .../simple/multi_task/DownloadActivity.java   |   2 +-
 .../simple/multi_task/MultiTaskActivity.java  |   2 +-
 .../simple/pop_task/DownloadPopupWindow.java  |   8 +-
 .../single_task/SingleTaskActivity.java       |   6 +-
 23 files changed, 452 insertions(+), 415 deletions(-)
 delete mode 100644 Aria/src/main/java/com/arialyy/aria/core/DownloadManager.java
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/DownloadReceiver.java
 rename Aria/src/main/java/com/arialyy/aria/core/{AMTarget.java => DownloadTarget.java} (81%)
 rename Aria/src/main/java/com/arialyy/aria/core/{receiver => }/IReceiver.java (78%)
 rename Aria/src/main/java/com/arialyy/aria/core/{receiver => }/UploadReceiver.java (82%)
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/WidgetLiftManager.java
 delete mode 100644 Aria/src/main/java/com/arialyy/aria/core/receiver/DownloadReceiver.java

diff --git a/Aria/src/main/java/com/arialyy/aria/core/Aria.java b/Aria/src/main/java/com/arialyy/aria/core/Aria.java
index 9183b797..8bd04957 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/Aria.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/Aria.java
@@ -26,7 +26,6 @@ import android.app.Service;
 import android.content.Context;
 import android.os.Build;
 import android.widget.PopupWindow;
-import com.arialyy.aria.core.receiver.DownloadReceiver;
 import com.arialyy.aria.core.scheduler.OnSchedulerListener;
 import com.arialyy.aria.core.task.Task;
 
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 eeff3689..95a9711b 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java
@@ -15,33 +15,30 @@
  */
 package com.arialyy.aria.core;
 
+import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
 import android.app.Activity;
 import android.app.Application;
 import android.app.Dialog;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.os.Build;
 import android.os.Bundle;
-import android.os.Message;
 import android.support.v4.app.Fragment;
 import android.text.TextUtils;
 import android.util.Log;
 import android.widget.PopupWindow;
-import com.arialyy.aria.core.command.download.CmdFactory;
-import com.arialyy.aria.core.receiver.DownloadReceiver;
-import com.arialyy.aria.util.CAConfiguration;
-import com.arialyy.aria.util.CheckUtil;
-import com.arialyy.aria.util.CommonUtil;
 import com.arialyy.aria.core.command.download.IDownloadCmd;
+import com.arialyy.aria.core.queue.DownloadTaskQueue;
+import com.arialyy.aria.core.queue.ITaskQueue;
+import com.arialyy.aria.orm.DbEntity;
+import com.arialyy.aria.orm.DbUtil;
+import com.arialyy.aria.util.CAConfiguration;
 import com.arialyy.aria.util.Configuration;
-import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Created by lyy on 2016/12/1.
@@ -50,18 +47,26 @@ import java.util.Set;
  */
 @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public class AriaManager {
   private static final String TAG = "AriaManager";
+  private static final String DOWNLOAD = "_download";
+  private static final String UPLOAD = "_upload";
   private static final Object LOCK = new Object();
-  private static volatile AriaManager INSTANCE = null;
-  private Map mDownloadTargets = new HashMap<>();
-  private DownloadManager mManager;
+  @SuppressLint("StaticFieldLeak") private static volatile AriaManager INSTANCE = null;
+  Map mReceivers = new HashMap<>();
   private LifeCallback mLifeCallback;
 
+  public static Context APP;
+  private ITaskQueue mTaskQueue;
+  private List mCommands = new ArrayList<>();
+
   private AriaManager(Context context) {
+    DbUtil.init(context.getApplicationContext());
+    APP = context;
+    DownloadTaskQueue.Builder builder = new DownloadTaskQueue.Builder(context);
+    mTaskQueue = builder.build();
     regAppLifeCallback(context);
-    mManager = DownloadManager.init(context);
   }
 
-  static AriaManager getInstance(Context context) {
+  public static AriaManager getInstance(Context context) {
     if (INSTANCE == null) {
       synchronized (LOCK) {
         INSTANCE = new AriaManager(context);
@@ -70,8 +75,54 @@ import java.util.Set;
     return INSTANCE;
   }
 
+  List getAllDownloadEntity() {
+    return DbEntity.findAllData(DownloadEntity.class);
+  }
+
+  /**
+   * 获取任务队列
+   */
+  public ITaskQueue getTaskQueue() {
+    return mTaskQueue;
+  }
+
+  /**
+   * 设置命令
+   */
+  AriaManager setCmd(IDownloadCmd command) {
+    mCommands.add(command);
+    return this;
+  }
+
+  /**
+   * 设置一组命令
+   */
+  AriaManager setCmds(List commands) {
+    if (commands != null && commands.size() > 0) {
+      mCommands.addAll(commands);
+    }
+    return this;
+  }
+
+  /**
+   * 执行所有设置的命令
+   */
+  synchronized void exe() {
+    for (IDownloadCmd command : mCommands) {
+      command.executeCmd();
+    }
+    mCommands.clear();
+  }
+
+  /**
+   * 处理下载操作
+   */
   DownloadReceiver download(Object obj) {
-    return getDownloadTarget(obj);
+    IReceiver receiver = mReceivers.get(getKey(true, obj));
+    if (receiver == null) {
+      receiver = putReceiver(true, obj);
+    }
+    return (receiver instanceof DownloadReceiver) ? (DownloadReceiver) receiver : null;
   }
 
   /**
@@ -92,43 +143,6 @@ import java.util.Set;
     CAConfiguration.CA_PATH = caPath;
   }
 
-  /**
-   * 获取下载列表
-   */
-  public List getDownloadList() {
-    return DownloadEntity.findAllData(DownloadEntity.class);
-  }
-
-  /**
-   * 通过下载链接获取下载实体
-   */
-  public DownloadEntity getDownloadEntity(String downloadUrl) {
-    CheckUtil.checkDownloadUrl(downloadUrl);
-    return DownloadEntity.findData(DownloadEntity.class, "downloadUrl=?", downloadUrl);
-  }
-
-  /**
-   * 下载任务是否存在
-   */
-  public boolean taskExists(String downloadUrl) {
-    return DownloadEntity.findData(DownloadEntity.class, "downloadUrl=?", downloadUrl) != null;
-  }
-
-  /**
-   * 停止所有正在下载的任务
-   */
-  public void stopAllTask() {
-    List allEntity = mManager.getAllDownloadEntity();
-    List stopCmds = new ArrayList<>();
-    for (DownloadEntity entity : allEntity) {
-      if (entity.getState() == DownloadEntity.STATE_DOWNLOAD_ING) {
-        stopCmds.add(
-            CommonUtil.createDownloadCmd(new DownloadTaskEntity(entity), CmdFactory.TASK_STOP));
-      }
-    }
-    mManager.setCmds(stopCmds).exe();
-  }
-
   /**
    * 设置下载超时时间
    */
@@ -138,7 +152,7 @@ import java.util.Set;
   }
 
   /**
-   * 设置下载失败重试次数
+   * 设置失败重试次数
    */
   public AriaManager setReTryNum(int reTryNum) {
     Configuration.getInstance().setReTryNum(reTryNum);
@@ -146,7 +160,7 @@ import java.util.Set;
   }
 
   /**
-   * 设置下载失败重试间隔
+   * 设置失败重试间隔
    */
   public AriaManager setReTryInterval(int interval) {
     Configuration.getInstance().setReTryInterval(interval);
@@ -171,32 +185,40 @@ import java.util.Set;
       Log.w(TAG, "最大任务数不能小于 1");
       return this;
     }
-    mManager.getTaskQueue().setDownloadNum(maxDownloadNum);
+    mTaskQueue.setDownloadNum(maxDownloadNum);
     return this;
   }
 
-  /**
-   * 删除所有任务
-   */
-  public void cancelAllTask() {
-    List allEntity = mManager.getAllDownloadEntity();
-    List cancelCmds = new ArrayList<>();
-    for (DownloadEntity entity : allEntity) {
-      cancelCmds.add(
-          CommonUtil.createDownloadCmd(new DownloadTaskEntity(entity), CmdFactory.TASK_CANCEL));
+  private IReceiver putReceiver(boolean isDownload, Object obj) {
+    final String key = getKey(isDownload, obj);
+    IReceiver receiver = mReceivers.get(key);
+    final WidgetLiftManager widgetLiftManager = new WidgetLiftManager();
+    if (obj instanceof Dialog) {
+      widgetLiftManager.handleDialogLift((Dialog) obj);
+    } else if (obj instanceof PopupWindow) {
+      widgetLiftManager.handlePopupWindowLift((PopupWindow) obj);
     }
-    mManager.setCmds(cancelCmds).exe();
-    Set keys = mDownloadTargets.keySet();
-    for (String key : keys) {
-      DownloadReceiver target = mDownloadTargets.get(key);
-      target.removeSchedulerListener();
-      mDownloadTargets.remove(key);
+
+    if (receiver == null) {
+      if (isDownload) {
+        DownloadReceiver dReceiver = new DownloadReceiver();
+        dReceiver.targetName = obj.getClass().getName();
+        mReceivers.put(key, dReceiver);
+        receiver = dReceiver;
+      } else {
+        UploadReceiver uReceiver = new UploadReceiver();
+
+        receiver = uReceiver;
+      }
     }
+    return receiver;
   }
 
-  private DownloadReceiver putTarget(Object obj) {
+  /**
+   * 根据功能类型和控件类型获取对应的key
+   */
+  private String getKey(boolean isDownload, Object obj) {
     String clsName = obj.getClass().getName();
-    DownloadReceiver target = null;
     String key = "";
     if (!(obj instanceof Activity)) {
       if (obj instanceof android.support.v4.app.Fragment) {
@@ -210,7 +232,6 @@ import java.util.Set;
         } else {
           key = clsName;
         }
-        handleDialogLift((Dialog) obj);
       } else if (obj instanceof PopupWindow) {
         Context context = ((PopupWindow) obj).getContentView().getContext();
         if (context instanceof Activity) {
@@ -218,7 +239,6 @@ import java.util.Set;
         } else {
           key = clsName;
         }
-        handlePopupWindowLift((PopupWindow) obj);
       }
     } else {
       key = clsName;
@@ -226,76 +246,8 @@ import java.util.Set;
     if (TextUtils.isEmpty(key)) {
       throw new IllegalArgumentException("未知类型");
     }
-    target = mDownloadTargets.get(key);
-    if (target == null) {
-      target = new DownloadReceiver();
-      target.targetName = obj.getClass().getName();
-      mDownloadTargets.put(key, target);
-    }
-    return target;
-  }
-
-  /**
-   * 出来悬浮框取消或dismiss
-   */
-  private void handlePopupWindowLift(PopupWindow popupWindow) {
-    try {
-      Field dismissField = CommonUtil.getField(popupWindow.getClass(), "mOnDismissListener");
-      PopupWindow.OnDismissListener listener =
-          (PopupWindow.OnDismissListener) dismissField.get(popupWindow);
-      if (listener != null) {
-        Log.e(TAG, "你已经对PopupWindow设置了Dismiss事件。为了防止内存泄露,"
-            + "请在dismiss方法中调用Aria.download(this).removeSchedulerListener();来注销事件");
-      } else {
-        popupWindow.setOnDismissListener(createPopupWindowListener(popupWindow));
-      }
-    } catch (IllegalAccessException e) {
-      e.printStackTrace();
-    }
-  }
-
-  /**
-   * 创建popupWindow dismiss事件
-   */
-  private PopupWindow.OnDismissListener createPopupWindowListener(final PopupWindow popupWindow) {
-    return new PopupWindow.OnDismissListener() {
-      @Override public void onDismiss() {
-        destroySchedulerListener(popupWindow);
-      }
-    };
-  }
-
-  /**
-   * 处理对话框取消或dismiss
-   */
-  private void handleDialogLift(Dialog dialog) {
-    try {
-      Field dismissField = CommonUtil.getField(dialog.getClass(), "mDismissMessage");
-      Message dismissMsg = (Message) dismissField.get(dialog);
-      //如果Dialog已经设置Dismiss事件,则查找cancel事件
-      if (dismissMsg != null) {
-        Field cancelField = CommonUtil.getField(dialog.getClass(), "mCancelMessage");
-        Message cancelMsg = (Message) cancelField.get(dialog);
-        if (cancelMsg != null) {
-          Log.e(TAG, "你已经对Dialog设置了Dismiss和cancel事件。为了防止内存泄露,"
-              + "请在dismiss方法中调用Aria.download(this).removeSchedulerListener();来注销事件");
-        } else {
-          dialog.setOnCancelListener(createCancelListener());
-        }
-      } else {
-        dialog.setOnDismissListener(createDismissListener());
-      }
-    } catch (IllegalAccessException e) {
-      e.printStackTrace();
-    }
-  }
-
-  private DownloadReceiver getDownloadTarget(Object obj) {
-    DownloadReceiver target = mDownloadTargets.get(obj.getClass().getName());
-    if (target == null) {
-      target = putTarget(obj);
-    }
-    return target;
+    key += isDownload ? DOWNLOAD : UPLOAD;
+    return key;
   }
 
   /**
@@ -309,43 +261,17 @@ import java.util.Set;
     }
   }
 
-  /**
-   * 创建Dialog取消事件
-   */
-  private Dialog.OnCancelListener createCancelListener() {
-    return new Dialog.OnCancelListener() {
-
-      @Override public void onCancel(DialogInterface dialog) {
-        destroySchedulerListener(dialog);
-      }
-    };
-  }
-
-  /**
-   * 创建Dialog dismiss取消事件
-   */
-  private Dialog.OnDismissListener createDismissListener() {
-    return new Dialog.OnDismissListener() {
-
-      @Override public void onDismiss(DialogInterface dialog) {
-        destroySchedulerListener(dialog);
-      }
-    };
-  }
-
   /**
    * onDestroy
    */
-  private void destroySchedulerListener(Object obj) {
-    Set keys = mDownloadTargets.keySet();
+  void destroySchedulerListener(Object obj) {
     String clsName = obj.getClass().getName();
-    for (
-        Iterator> iter = mDownloadTargets.entrySet().iterator();
+    for (Iterator> iter = mReceivers.entrySet().iterator();
         iter.hasNext(); ) {
-      Map.Entry entry = iter.next();
+      Map.Entry entry = iter.next();
       String key = entry.getKey();
-      if (key.equals(clsName) || key.contains(clsName)) {
-        DownloadReceiver receiver = mDownloadTargets.get(key);
+      if (key.contains(clsName)) {
+        IReceiver receiver = mReceivers.get(key);
         receiver.removeSchedulerListener();
         receiver.destroy();
         iter.remove();
diff --git a/Aria/src/main/java/com/arialyy/aria/core/DownloadManager.java b/Aria/src/main/java/com/arialyy/aria/core/DownloadManager.java
deleted file mode 100644
index d8119bb8..00000000
--- a/Aria/src/main/java/com/arialyy/aria/core/DownloadManager.java
+++ /dev/null
@@ -1,107 +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;
-
-import android.content.Context;
-import com.arialyy.aria.core.queue.ITaskQueue;
-import com.arialyy.aria.orm.DbUtil;
-import com.arialyy.aria.core.command.download.IDownloadCmd;
-import com.arialyy.aria.core.queue.DownloadTaskQueue;
-import com.arialyy.aria.orm.DbEntity;
-import com.arialyy.aria.util.Configuration;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by lyy on 2016/8/11.
- * 下载管理器,通过命令的方式控制下载
- */
-public class DownloadManager {
-  private static final    String             TAG              = "DownloadManager";
-  private static final    Object             LOCK             = new Object();
-  private static volatile DownloadManager    INSTANCE         = null;
-  private                 List mCommands        = new ArrayList<>();
-  public static  Context       APP;
-  private        ITaskQueue    mTaskQueue;
-  private static Configuration mConfig;
-
-  private DownloadManager() {
-
-  }
-
-  private DownloadManager(Context context) {
-    APP = context;
-    DownloadTaskQueue.Builder builder = new DownloadTaskQueue.Builder(context);
-    mTaskQueue = builder.build();
-    DbUtil.init(context);
-  }
-
-  static DownloadManager init(Context context) {
-    if (INSTANCE == null) {
-      synchronized (LOCK) {
-        INSTANCE = new DownloadManager(context.getApplicationContext());
-      }
-    }
-    return INSTANCE;
-  }
-
-  public static DownloadManager getInstance() {
-    if (INSTANCE == null) {
-      throw new NullPointerException("请在Application中调用init进行下载器注册");
-    }
-    return INSTANCE;
-  }
-
-  List getAllDownloadEntity() {
-    return DbEntity.findAllData(DownloadEntity.class);
-  }
-
-  /**
-   * 获取任务队列
-   */
-  public ITaskQueue getTaskQueue() {
-    return mTaskQueue;
-  }
-
-  /**
-   * 设置命令
-   */
-  DownloadManager setCmd(IDownloadCmd command) {
-    mCommands.add(command);
-    return this;
-  }
-
-  /**
-   * 设置一组命令
-   */
-  DownloadManager setCmds(List commands) {
-    if (commands != null && commands.size() > 0) {
-      mCommands.addAll(commands);
-    }
-    return this;
-  }
-
-  /**
-   * 执行所有设置的命令
-   */
-  synchronized void exe() {
-    for (IDownloadCmd command : mCommands) {
-      command.executeCmd();
-    }
-    mCommands.clear();
-  }
-}
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/DownloadReceiver.java
new file mode 100644
index 00000000..8a2237a8
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/DownloadReceiver.java
@@ -0,0 +1,141 @@
+/*
+ * 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;
+
+import android.support.annotation.NonNull;
+import com.arialyy.aria.core.command.download.CmdFactory;
+import com.arialyy.aria.core.command.download.IDownloadCmd;
+import com.arialyy.aria.core.scheduler.DownloadSchedulers;
+import com.arialyy.aria.core.scheduler.OnSchedulerListener;
+import com.arialyy.aria.util.CheckUtil;
+import com.arialyy.aria.util.CommonUtil;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by lyy on 2016/12/5.
+ * 下载功能接收器
+ */
+public class DownloadReceiver implements IReceiver{
+  private static final String TAG = "DownloadReceiver";
+  public String targetName;
+  public OnSchedulerListener listener;
+
+  /**
+   * {@link #load(String)},请使用该方法
+   */
+  @Deprecated public DownloadTarget load(DownloadEntity entity) {
+    return new DownloadTarget(entity, targetName);
+  }
+
+  /**
+   * 读取下载链接
+   */
+  public DownloadTarget load(@NonNull String downloadUrl) {
+    CheckUtil.checkDownloadUrl(downloadUrl);
+    DownloadEntity entity =
+        DownloadEntity.findData(DownloadEntity.class, "downloadUrl=?", downloadUrl);
+    if (entity == null) {
+      entity = new DownloadEntity();
+    }
+    entity.setDownloadUrl(downloadUrl);
+    return new DownloadTarget(entity, targetName);
+  }
+
+  /**
+   * 添加调度器回调
+   */
+  public DownloadReceiver addSchedulerListener(OnSchedulerListener listener) {
+    this.listener = listener;
+    DownloadSchedulers.getInstance().addSchedulerListener(targetName, listener);
+    return this;
+  }
+
+  /**
+   * 移除回调
+   */
+  @Override
+  public void removeSchedulerListener() {
+    if (listener != null) {
+      DownloadSchedulers.getInstance().removeSchedulerListener(targetName, listener);
+    }
+  }
+
+  @Override
+  public void destroy() {
+    targetName = null;
+    listener = null;
+  }
+
+  /**
+   * 获取下载列表
+   */
+  public List getDownloadList() {
+    return DownloadEntity.findAllData(DownloadEntity.class);
+  }
+
+  /**
+   * 通过下载链接获取下载实体
+   */
+  public DownloadEntity getDownloadEntity(String downloadUrl) {
+    CheckUtil.checkDownloadUrl(downloadUrl);
+    return DownloadEntity.findData(DownloadEntity.class, "downloadUrl=?", downloadUrl);
+  }
+
+  /**
+   * 下载任务是否存在
+   */
+  public boolean taskExists(String downloadUrl) {
+    return DownloadEntity.findData(DownloadEntity.class, "downloadUrl=?", downloadUrl) != null;
+  }
+
+  /**
+   * 停止所有正在下载的任务
+   */
+  public void stopAllTask() {
+    final AriaManager ariaManager = AriaManager.getInstance(AriaManager.APP);
+    List allEntity = ariaManager.getAllDownloadEntity();
+    List stopCmds = new ArrayList<>();
+    for (DownloadEntity entity : allEntity) {
+      if (entity.getState() == DownloadEntity.STATE_DOWNLOAD_ING) {
+        stopCmds.add(
+            CommonUtil.createDownloadCmd(new DownloadTaskEntity(entity), CmdFactory.TASK_STOP));
+      }
+    }
+    ariaManager.setCmds(stopCmds).exe();
+  }
+
+  /**
+   * 删除所有任务
+   */
+  public void cancelAllTask() {
+    final AriaManager ariaManager = AriaManager.getInstance(AriaManager.APP);
+    List allEntity = ariaManager.getAllDownloadEntity();
+    List cancelCmds = new ArrayList<>();
+    for (DownloadEntity entity : allEntity) {
+      cancelCmds.add(
+          CommonUtil.createDownloadCmd(new DownloadTaskEntity(entity), CmdFactory.TASK_CANCEL));
+    }
+    ariaManager.setCmds(cancelCmds).exe();
+    Set keys = ariaManager.mReceivers.keySet();
+    for (String key : keys) {
+      IReceiver receiver = ariaManager.mReceivers.get(key);
+      receiver.removeSchedulerListener();
+      ariaManager.mReceivers.remove(key);
+    }
+  }
+}
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/AMTarget.java b/Aria/src/main/java/com/arialyy/aria/core/DownloadTarget.java
similarity index 81%
rename from Aria/src/main/java/com/arialyy/aria/core/AMTarget.java
rename to Aria/src/main/java/com/arialyy/aria/core/DownloadTarget.java
index d5b1a5ad..6eae0275 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/AMTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/DownloadTarget.java
@@ -22,22 +22,20 @@ import com.arialyy.aria.core.command.download.IDownloadCmd;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.WeakHashMap;
 
 /**
  * Created by lyy on 2016/12/5.
  * https://github.com/AriaLyy/Aria
  */
-public class AMTarget {
+public class DownloadTarget {
   DownloadEntity entity;
   String targetName;
   DownloadTaskEntity taskEntity;
 
-  public AMTarget(DownloadEntity entity, String targetName) {
+  public DownloadTarget(DownloadEntity entity, String targetName) {
     this.entity = entity;
     this.targetName = targetName;
     taskEntity = new DownloadTaskEntity(entity);
@@ -49,7 +47,7 @@ public class AMTarget {
    * @param key 头部key
    * @param header 头部value
    */
-  public AMTarget addHeader(@NonNull String key, @NonNull String header) {
+  public DownloadTarget addHeader(@NonNull String key, @NonNull String header) {
     taskEntity.headers.put(key, header);
     return this;
   }
@@ -59,7 +57,7 @@ public class AMTarget {
    *
    * @param headers Map
    */
-  public AMTarget addHeaders(Map headers) {
+  public DownloadTarget addHeaders(Map headers) {
     if (headers != null && headers.size() > 0) {
       Set keys = headers.keySet();
       for (String key : keys) {
@@ -72,7 +70,7 @@ public class AMTarget {
   /**
    * 设置文件存储路径
    */
-  public AMTarget setDownloadPath(@NonNull String downloadPath) {
+  public DownloadTarget setDownloadPath(@NonNull String downloadPath) {
     if (TextUtils.isEmpty(downloadPath)) {
       throw new IllegalArgumentException("文件保持路径不能为null");
     }
@@ -80,10 +78,20 @@ public class AMTarget {
     return this;
   }
 
+  /**
+   * 设置请求类型
+   *
+   * @param requestEnum {@link RequestEnum}
+   */
+  public DownloadTarget setRequestMode(RequestEnum requestEnum) {
+    taskEntity.requestEnum = requestEnum;
+    return this;
+  }
+
   /**
    * 设置文件名
    */
-  public AMTarget setDownloadName(@NonNull String downloadName) {
+  public DownloadTarget setDownloadName(@NonNull String downloadName) {
     if (TextUtils.isEmpty(downloadName)) {
       throw new IllegalArgumentException("文件名不能为null");
     }
@@ -122,7 +130,7 @@ public class AMTarget {
    * 添加任务
    */
   public void add() {
-    DownloadManager.getInstance()
+    AriaManager.getInstance(AriaManager.APP)
         .setCmd(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_CREATE))
         .exe();
   }
@@ -134,7 +142,7 @@ public class AMTarget {
     List cmds = new ArrayList<>();
     cmds.add(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_CREATE));
     cmds.add(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_START));
-    DownloadManager.getInstance().setCmds(cmds).exe();
+    AriaManager.getInstance(AriaManager.APP).setCmds(cmds).exe();
     cmds.clear();
   }
 
@@ -142,7 +150,7 @@ public class AMTarget {
    * 停止下载
    */
   public void stop() {
-    DownloadManager.getInstance()
+    AriaManager.getInstance(AriaManager.APP)
         .setCmd(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_STOP))
         .exe();
   }
@@ -151,7 +159,7 @@ public class AMTarget {
    * 恢复下载
    */
   public void resume() {
-    DownloadManager.getInstance()
+    AriaManager.getInstance(AriaManager.APP)
         .setCmd(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_START))
         .exe();
   }
@@ -160,7 +168,7 @@ public class AMTarget {
    * 取消下载
    */
   public void cancel() {
-    DownloadManager.getInstance()
+    AriaManager.getInstance(AriaManager.APP)
         .setCmd(CommonUtil.createDownloadCmd(targetName, taskEntity, CmdFactory.TASK_CANCEL))
         .exe();
   }
@@ -169,7 +177,7 @@ public class AMTarget {
    * 是否在下载
    */
   public boolean isDownloading() {
-    return DownloadManager.getInstance().getTaskQueue().getTask(entity).isDownloading();
+    return AriaManager.getInstance(AriaManager.APP).getTaskQueue().getTask(entity).isDownloading();
   }
 
   /**
diff --git a/Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java
index 02517f71..9d15475e 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java
@@ -1,3 +1,18 @@
+/*
+ * 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;
 
 import java.util.HashMap;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/receiver/IReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/IReceiver.java
similarity index 78%
rename from Aria/src/main/java/com/arialyy/aria/core/receiver/IReceiver.java
rename to Aria/src/main/java/com/arialyy/aria/core/IReceiver.java
index bf25c280..6aebd8c4 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/receiver/IReceiver.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/IReceiver.java
@@ -13,12 +13,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core.receiver;
+package com.arialyy.aria.core;
 
 /**
  * Created by Aria.Lao on 2017/2/6.
  */
+interface IReceiver {
+  /**
+   * Receiver 销毁
+   */
+  public void destroy();
 
-public interface IReceiver {
-
+  /**
+   * 移除事件回调
+   */
+  public void removeSchedulerListener();
 }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/RequestEnum.java b/Aria/src/main/java/com/arialyy/aria/core/RequestEnum.java
index 1919a949..4d3766d5 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/RequestEnum.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/RequestEnum.java
@@ -1,9 +1,24 @@
+/*
+ * 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 Aria.Lao on 2017/1/23.
+ * url请求方式,目前支持GET、POST
  */
-
 public enum RequestEnum {
   GET("GET"), POST("POST");
 
diff --git a/Aria/src/main/java/com/arialyy/aria/core/receiver/UploadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/UploadReceiver.java
similarity index 82%
rename from Aria/src/main/java/com/arialyy/aria/core/receiver/UploadReceiver.java
rename to Aria/src/main/java/com/arialyy/aria/core/UploadReceiver.java
index cc3329a7..51eff28d 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/receiver/UploadReceiver.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/UploadReceiver.java
@@ -13,12 +13,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core.receiver;
+package com.arialyy.aria.core;
 
 /**
  * Created by Aria.Lao on 2017/2/6.
+ * 上传功能接收器
  */
-
 public class UploadReceiver implements IReceiver {
 
+  @Override public void destroy() {
+
+  }
+
+  @Override public void removeSchedulerListener() {
+
+  }
 }
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/WidgetLiftManager.java b/Aria/src/main/java/com/arialyy/aria/core/WidgetLiftManager.java
new file mode 100644
index 00000000..f604c93f
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/WidgetLiftManager.java
@@ -0,0 +1,111 @@
+/*
+ * 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;
+
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Message;
+import android.util.Log;
+import android.widget.PopupWindow;
+import com.arialyy.aria.util.CommonUtil;
+import java.lang.reflect.Field;
+
+/**
+ * Created by Aria.Lao on 2017/2/7.
+ * 为组件添加生命周期
+ */
+final class WidgetLiftManager {
+  private final String TAG = "WidgetLiftManager";
+
+  /**
+   * 处理悬浮框取消或dismiss事件
+   */
+  void handlePopupWindowLift(PopupWindow popupWindow) {
+    try {
+      Field dismissField = CommonUtil.getField(popupWindow.getClass(), "mOnDismissListener");
+      PopupWindow.OnDismissListener listener =
+          (PopupWindow.OnDismissListener) dismissField.get(popupWindow);
+      if (listener != null) {
+        Log.e(TAG, "你已经对PopupWindow设置了Dismiss事件。为了防止内存泄露,"
+            + "请在dismiss方法中调用Aria.download(this).removeSchedulerListener();来注销事件");
+      } else {
+        popupWindow.setOnDismissListener(createPopupWindowListener(popupWindow));
+      }
+    } catch (IllegalAccessException e) {
+      e.printStackTrace();
+    }
+  }
+
+  /**
+   * 创建popupWindow dismiss事件
+   */
+  private PopupWindow.OnDismissListener createPopupWindowListener(final PopupWindow popupWindow) {
+    return new PopupWindow.OnDismissListener() {
+      @Override public void onDismiss() {
+        AriaManager.getInstance(AriaManager.APP).destroySchedulerListener(popupWindow);
+      }
+    };
+  }
+
+  /**
+   * 处理对话框取消或dismiss
+   */
+  void handleDialogLift(Dialog dialog) {
+    try {
+      Field dismissField = CommonUtil.getField(dialog.getClass(), "mDismissMessage");
+      Message dismissMsg = (Message) dismissField.get(dialog);
+      //如果Dialog已经设置Dismiss事件,则查找cancel事件
+      if (dismissMsg != null) {
+        Field cancelField = CommonUtil.getField(dialog.getClass(), "mCancelMessage");
+        Message cancelMsg = (Message) cancelField.get(dialog);
+        if (cancelMsg != null) {
+          Log.e(TAG, "你已经对Dialog设置了Dismiss和cancel事件。为了防止内存泄露,"
+              + "请在dismiss方法中调用Aria.download(this).removeSchedulerListener();来注销事件");
+        } else {
+          dialog.setOnCancelListener(createCancelListener());
+        }
+      } else {
+        dialog.setOnDismissListener(createDismissListener());
+      }
+    } catch (IllegalAccessException e) {
+      e.printStackTrace();
+    }
+  }
+
+  /**
+   * 创建Dialog取消事件
+   */
+  private Dialog.OnCancelListener createCancelListener() {
+    return new Dialog.OnCancelListener() {
+
+      @Override public void onCancel(DialogInterface dialog) {
+        AriaManager.getInstance(AriaManager.APP).destroySchedulerListener(dialog);
+      }
+    };
+  }
+
+  /**
+   * 创建Dialog dismiss取消事件
+   */
+  private Dialog.OnDismissListener createDismissListener() {
+    return new Dialog.OnDismissListener() {
+
+      @Override public void onDismiss(DialogInterface dialog) {
+        AriaManager.getInstance(AriaManager.APP).destroySchedulerListener(dialog);
+      }
+    };
+  }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java
index f9bb1bd7..ea1909a6 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java
@@ -16,12 +16,11 @@
 
 package com.arialyy.aria.core.command.download;
 
-import com.arialyy.aria.core.DownloadManager;
+import com.arialyy.aria.core.AriaManager;
 import com.arialyy.aria.core.DownloadTaskEntity;
 import com.arialyy.aria.core.queue.ITaskQueue;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
-import com.arialyy.aria.core.DownloadEntity;
 
 /**
  * Created by lyy on 2016/8/22.
@@ -50,7 +49,7 @@ public abstract class IDownloadCmd {
     mTargetName = targetName;
     mEntity = entity;
     TAG = CommonUtil.getClassName(this);
-    mQueue = DownloadManager.getInstance().getTaskQueue();
+    mQueue = AriaManager.getInstance(AriaManager.APP).getTaskQueue();
   }
 
   /**
diff --git a/Aria/src/main/java/com/arialyy/aria/core/receiver/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/receiver/DownloadReceiver.java
deleted file mode 100644
index 5ba5e251..00000000
--- a/Aria/src/main/java/com/arialyy/aria/core/receiver/DownloadReceiver.java
+++ /dev/null
@@ -1,77 +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.receiver;
-
-import android.support.annotation.NonNull;
-import com.arialyy.aria.core.AMTarget;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.scheduler.DownloadSchedulers;
-import com.arialyy.aria.core.scheduler.OnSchedulerListener;
-import com.arialyy.aria.util.CheckUtil;
-
-/**
- * Created by lyy on 2016/12/5.
- * AM 接收器
- */
-public class DownloadReceiver {
-  public String targetName;
-  public OnSchedulerListener listener;
-
-  /**
-   * {@link #load(String)},请使用该方法
-   */
-  @Deprecated public AMTarget load(DownloadEntity entity) {
-    return new AMTarget(entity, targetName);
-  }
-
-  /**
-   * 读取下载链接
-   */
-  public AMTarget load(@NonNull String downloadUrl) {
-    CheckUtil.checkDownloadUrl(downloadUrl);
-    DownloadEntity entity =
-        DownloadEntity.findData(DownloadEntity.class, "downloadUrl=?", downloadUrl);
-    if (entity == null) {
-      entity = new DownloadEntity();
-    }
-    entity.setDownloadUrl(downloadUrl);
-    return new AMTarget(entity, targetName);
-  }
-
-  /**
-   * 添加调度器回调
-   */
-  public DownloadReceiver addSchedulerListener(OnSchedulerListener listener) {
-    this.listener = listener;
-    DownloadSchedulers.getInstance().addSchedulerListener(targetName, listener);
-    return this;
-  }
-
-  /**
-   * 移除回调
-   */
-  public DownloadReceiver removeSchedulerListener() {
-    if (listener != null) {
-      DownloadSchedulers.getInstance().removeSchedulerListener(targetName, listener);
-    }
-    return this;
-  }
-
-  public void destroy() {
-    targetName = null;
-    listener = null;
-  }
-}
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java b/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java
index 25e9385c..3a11b779 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java
@@ -18,9 +18,8 @@ package com.arialyy.aria.core.scheduler;
 
 import android.os.CountDownTimer;
 import android.os.Message;
-import android.text.TextUtils;
 import android.util.Log;
-import com.arialyy.aria.core.DownloadManager;
+import com.arialyy.aria.core.AriaManager;
 import com.arialyy.aria.core.queue.ITaskQueue;
 import com.arialyy.aria.core.DownloadEntity;
 import com.arialyy.aria.core.task.Task;
@@ -75,11 +74,10 @@ public class DownloadSchedulers implements IDownloadSchedulers {
    * 下载器任务监听
    */
   Map mSchedulerListeners = new ConcurrentHashMap<>();
-  DownloadManager mManager = DownloadManager.getInstance();
   ITaskQueue mQueue;
 
   private DownloadSchedulers() {
-    mQueue = mManager.getTaskQueue();
+    mQueue = AriaManager.getInstance(AriaManager.APP).getTaskQueue();
   }
 
   public static DownloadSchedulers getInstance() {
diff --git a/Aria/src/main/java/com/arialyy/aria/util/Configuration.java b/Aria/src/main/java/com/arialyy/aria/util/Configuration.java
index de3703d7..3c2ae6f4 100644
--- a/Aria/src/main/java/com/arialyy/aria/util/Configuration.java
+++ b/Aria/src/main/java/com/arialyy/aria/util/Configuration.java
@@ -16,7 +16,7 @@
 package com.arialyy.aria.util;
 
 import android.util.Log;
-import com.arialyy.aria.core.DownloadManager;
+import com.arialyy.aria.core.AriaManager;
 import java.io.File;
 import java.io.IOException;
 import java.util.Map;
@@ -67,7 +67,7 @@ public class Configuration {
   }
 
   private Configuration() {
-    mConfigFile = new File(DownloadManager.APP.getFilesDir().getPath() + CONFIG_FILE);
+    mConfigFile = new File(AriaManager.APP.getFilesDir().getPath() + CONFIG_FILE);
     try {
       if (!mConfigFile.exists()) {
         mConfigFile.getParentFile().mkdirs();
diff --git a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java
index af40e0de..b93328f8 100644
--- a/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java
+++ b/Aria/src/main/java/com/arialyy/aria/util/SSLContextUtil.java
@@ -16,10 +16,7 @@
 package com.arialyy.aria.util;
 
 import android.text.TextUtils;
-import com.arialyy.aria.core.DownloadManager;
-import java.io.BufferedInputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
+import com.arialyy.aria.core.AriaManager;
 import java.io.IOException;
 import java.io.InputStream;
 import java.security.KeyManagementException;
@@ -42,8 +39,8 @@ import javax.net.ssl.X509TrustManager;
 
 /**
  * Created by Aria.Lao on 2017/1/11.
+ * SSL证书工具
  */
-
 public class SSLContextUtil {
 
   /**
@@ -61,7 +58,7 @@ public class SSLContextUtil {
     CertificateFactory cf = null;
     try {
       cf = CertificateFactory.getInstance("X.509");
-      InputStream caInput = DownloadManager.APP.getAssets().open(caPath);
+      InputStream caInput = AriaManager.APP.getAssets().open(caPath);
       Certificate ca;
       ca = cf.generateCertificate(caInput);
       System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
diff --git a/app/src/main/java/com/arialyy/simple/base/BaseApplication.java b/app/src/main/java/com/arialyy/simple/base/BaseApplication.java
index 39f4aea0..187716cf 100644
--- a/app/src/main/java/com/arialyy/simple/base/BaseApplication.java
+++ b/app/src/main/java/com/arialyy/simple/base/BaseApplication.java
@@ -18,7 +18,6 @@
 package com.arialyy.simple.base;
 
 import android.app.Application;
-import com.arialyy.aria.core.DownloadManager;
 import com.arialyy.frame.core.AbsFrame;
 
 /**
@@ -28,6 +27,5 @@ public class BaseApplication extends Application {
   @Override public void onCreate() {
     super.onCreate();
     AbsFrame.init(this);
-    //DownloadManager.init(this);
   }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java b/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java
index be9d1e87..6f3ac0d5 100644
--- a/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java
+++ b/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java
@@ -7,7 +7,7 @@ import android.widget.Button;
 import android.widget.TextView;
 import butterknife.Bind;
 import butterknife.OnClick;
-import com.arialyy.aria.core.AMTarget;
+import com.arialyy.aria.core.DownloadTarget;
 import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.DownloadEntity;
 import com.arialyy.aria.core.task.Task;
@@ -40,13 +40,13 @@ public class DownloadDialog extends AbsDialog {
   }
 
   private void init() {
-    if (Aria.get(this).taskExists(DOWNLOAD_URL)) {
-      AMTarget target = Aria.download(this).load(DOWNLOAD_URL);
+    if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
+      DownloadTarget target = Aria.download(this).load(DOWNLOAD_URL);
       int      p      = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
       mPb.setProgress(p);
     }
     Aria.download(this).addSchedulerListener(new MyDialogDownloadCallback());
-    DownloadEntity entity = Aria.get(this).getDownloadEntity(DOWNLOAD_URL);
+    DownloadEntity entity = Aria.download(this).getDownloadEntity(DOWNLOAD_URL);
     if (entity != null) {
       mSize.setText(CommonUtil.formatFileSize(entity.getFileSize()));
       int state = entity.getState();
diff --git a/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java b/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java
index 44bf2faa..a97e03a0 100644
--- a/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java
+++ b/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java
@@ -7,7 +7,7 @@ import android.widget.Button;
 import android.widget.TextView;
 import butterknife.Bind;
 import butterknife.OnClick;
-import com.arialyy.aria.core.AMTarget;
+import com.arialyy.aria.core.DownloadTarget;
 import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.DownloadEntity;
 import com.arialyy.aria.core.task.Task;
@@ -32,12 +32,12 @@ public class DownloadFragment extends AbsFragment {
       "http://static.gaoshouyou.com/d/3a/93/573ae1db9493a801c24bf66128b11e39.apk";
 
   @Override protected void init(Bundle savedInstanceState) {
-    if (Aria.get(this).taskExists(DOWNLOAD_URL)) {
-      AMTarget target = Aria.download(this).load(DOWNLOAD_URL);
+    if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
+      DownloadTarget target = Aria.download(this).load(DOWNLOAD_URL);
       int      p      = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
       mPb.setProgress(p);
     }
-    DownloadEntity entity = Aria.get(this).getDownloadEntity(DOWNLOAD_URL);
+    DownloadEntity entity = Aria.download(this).getDownloadEntity(DOWNLOAD_URL);
     if (entity != null) {
       mSize.setText(CommonUtil.formatFileSize(entity.getFileSize()));
       int state = entity.getState();
diff --git a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java
index b9ac5582..fad25862 100644
--- a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java
+++ b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java
@@ -86,7 +86,7 @@ public class DownloadModule extends BaseModule {
     String[] urls = getContext().getResources().getStringArray(R.array.test_apk_download_url);
     List list = new ArrayList<>();
     for (String url : urls) {
-      DownloadEntity entity = Aria.get(getContext()).getDownloadEntity(url);
+      DownloadEntity entity = Aria.download(getContext()).getDownloadEntity(url);
       if (entity == null) {
         entity = createDownloadEntity(url);
       }
diff --git a/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java b/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java
index 74402096..30b98b98 100644
--- a/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java
@@ -25,7 +25,7 @@ public class DownloadActivity extends BaseActivity {
 
   @Override protected void init(Bundle savedInstanceState) {
     super.init(savedInstanceState);
-    mAdapter = new DownloadAdapter(this, Aria.get(this).getDownloadList());
+    mAdapter = new DownloadAdapter(this, Aria.download(this).getDownloadList());
     mList.setLayoutManager(new LinearLayoutManager(this));
     mList.setAdapter(mAdapter);
   }
diff --git a/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java b/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java
index d838e31c..4b7f6aae 100644
--- a/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java
+++ b/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java
@@ -62,7 +62,7 @@ public class MultiTaskActivity extends BaseActivity {
         dialog.show(getSupportFragmentManager(), "download_num");
         break;
       case R.id.stop_all:
-        Aria.get(this).stopAllTask();
+        Aria.download(this).stopAllTask();
         break;
       case R.id.turn:
         startActivity(new Intent(this, DownloadActivity.class));
diff --git a/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java b/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java
index 926a8dfe..171c52ab 100644
--- a/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java
+++ b/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java
@@ -9,7 +9,7 @@ import android.widget.Button;
 import android.widget.TextView;
 import butterknife.Bind;
 import butterknife.OnClick;
-import com.arialyy.aria.core.AMTarget;
+import com.arialyy.aria.core.DownloadTarget;
 import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.DownloadEntity;
 import com.arialyy.aria.core.task.Task;
@@ -42,13 +42,13 @@ public class DownloadPopupWindow extends AbsPopupWindow {
   }
 
   private void initWidget() {
-    if (Aria.get(this).taskExists(DOWNLOAD_URL)) {
-      AMTarget target = Aria.download(this).load(DOWNLOAD_URL);
+    if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
+      DownloadTarget target = Aria.download(this).load(DOWNLOAD_URL);
       int      p      = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
       mPb.setProgress(p);
     }
     Aria.download(this).addSchedulerListener(new MyDialogDownloadCallback());
-    DownloadEntity entity = Aria.get(this).getDownloadEntity(DOWNLOAD_URL);
+    DownloadEntity entity = Aria.download(this).getDownloadEntity(DOWNLOAD_URL);
     if (entity != null) {
       mSize.setText(CommonUtil.formatFileSize(entity.getFileSize()));
       int state = entity.getState();
diff --git a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java
index 8915bb54..b039d3a3 100644
--- a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java
+++ b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java
@@ -30,7 +30,7 @@ import android.widget.ImageView;
 import android.widget.TextView;
 import android.widget.Toast;
 import butterknife.Bind;
-import com.arialyy.aria.core.AMTarget;
+import com.arialyy.aria.core.DownloadTarget;
 import com.arialyy.aria.core.Aria;
 import com.arialyy.aria.core.DownloadEntity;
 import com.arialyy.aria.core.task.Task;
@@ -161,8 +161,8 @@ public class SingleTaskActivity extends BaseActivity {
   }
 
   private void init() {
-    if (Aria.get(this).taskExists(DOWNLOAD_URL)) {
-      AMTarget target = Aria.download(this).load(DOWNLOAD_URL);
+    if (Aria.download(this).taskExists(DOWNLOAD_URL)) {
+      DownloadTarget target = Aria.download(this).load(DOWNLOAD_URL);
       int      p      = (int) (target.getCurrentProgress() * 100 / target.getFileSize());
       mPb.setProgress(p);
     }

From d05b685fa30a2e3daea820322f67328cd9ec4706 Mon Sep 17 00:00:00 2001
From: AriaLyy <511455842@qq.com>
Date: Thu, 9 Feb 2017 18:19:43 +0800
Subject: [PATCH 03/37] =?UTF-8?q?upload=EF=BC=8C=E4=BB=A3=E7=A0=81?=
 =?UTF-8?q?=E9=87=8D=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .idea/misc.xml                                |   2 +-
 .../main/java/com/arialyy/aria/core/Aria.java |  21 +--
 .../com/arialyy/aria/core/AriaManager.java    |  27 ++--
 .../core/{ => download}/DownloadEntity.java   |   2 +-
 .../core/{ => download}/DownloadReceiver.java |  20 +--
 .../core/{ => download}/DownloadTarget.java   |   8 +-
 .../{ => download}/DownloadTaskEntity.java    |   3 +-
 .../download => download/command}/AddCmd.java |   9 +-
 .../command}/CancelCmd.java                   |   9 +-
 .../command}/CmdFactory.java                  |   5 +-
 .../command}/IDownloadCmd.java                |  17 +-
 .../command}/SingleCmd.java                   |   6 +-
 .../command}/StartCmd.java                    |   9 +-
 .../command}/StopCmd.java                     |  10 +-
 .../queue/DownloadTaskQueue.java              |  44 ++---
 .../{ => download}/queue/IDownloader.java     |  20 +--
 .../aria/core/{ => download}/queue/IPool.java |  12 +-
 .../core/{ => download}/queue/ITaskQueue.java |  19 ++-
 .../{ => download}/queue/pool/CachePool.java  |  22 +--
 .../queue/pool/ExecutePool.java               |  30 ++--
 .../scheduler/DownloadSchedulers.java         |  18 +--
 .../scheduler/IDownloadSchedulers.java        |   4 +-
 .../scheduler/OnSchedulerListener.java        |  20 +--
 .../{ => download}/task/ConnectionHelp.java   |   4 +-
 .../{ => download}/task/DownloadListener.java |   2 +-
 .../task/DownloadStateConstance.java          |   2 +-
 .../task/DownloadTask.java}                   |  26 +--
 .../task/DownloadTaskFactory.java}            |  24 +--
 .../{ => download}/task/DownloadUtil.java     |   6 +-
 .../task/IDownloadListener.java               |   2 +-
 .../{ => download}/task/IDownloadUtil.java    |   4 +-
 .../{ => download}/task/SingleThreadTask.java |   2 +-
 .../java/com/arialyy/aria/core/inf/ICmd.java  |  12 ++
 .../aria/core/{ => inf}/IReceiver.java        |   4 +-
 .../aria/core/upload/IUploadListener.java     |  11 ++
 .../aria/core/upload/MultipartUtility.java    | 150 ++++++++++++++++++
 .../aria/core/upload/UploadEntity.java        |  30 ++++
 .../core/{ => upload}/UploadReceiver.java     |   4 +-
 .../aria/core/upload/UploadTaskEntity.java    |  22 +++
 .../arialyy/aria/core/upload/UploadUtil.java  | 122 ++++++++++++++
 .../java/com/arialyy/aria/util/CheckUtil.java |  27 +++-
 .../com/arialyy/aria/util/CommonUtil.java     |   7 +-
 app/src/main/AndroidManifest.xml              |   3 +-
 .../simple/dialog_task/DownloadDialog.java    |  14 +-
 .../fragment_task/DownloadFragment.java       |  14 +-
 .../arialyy/simple/module/DownloadModule.java |   2 +-
 .../simple/multi_task/DownloadActivity.java   |  18 +--
 .../simple/multi_task/DownloadAdapter.java    |   2 +-
 .../simple/multi_task/MultiTaskActivity.java  |  12 +-
 .../notification/SimpleNotification.java      |  14 +-
 .../simple/pop_task/DownloadPopupWindow.java  |  14 +-
 .../single_task/SingleTaskActivity.java       |  22 +--
 .../main/java/com/arialyy/simple/upload.java  |  36 +++++
 app/src/main/res/layout/activity_upload.xml   |  22 +++
 54 files changed, 697 insertions(+), 274 deletions(-)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/DownloadEntity.java (99%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/DownloadReceiver.java (86%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/DownloadTarget.java (95%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/DownloadTaskEntity.java (92%)
 rename Aria/src/main/java/com/arialyy/aria/core/{command/download => download/command}/AddCmd.java (82%)
 rename Aria/src/main/java/com/arialyy/aria/core/{command/download => download/command}/CancelCmd.java (82%)
 rename Aria/src/main/java/com/arialyy/aria/core/{command/download => download/command}/CmdFactory.java (96%)
 rename Aria/src/main/java/com/arialyy/aria/core/{command/download => download/command}/IDownloadCmd.java (79%)
 rename Aria/src/main/java/com/arialyy/aria/core/{command/download => download/command}/SingleCmd.java (89%)
 rename Aria/src/main/java/com/arialyy/aria/core/{command/download => download/command}/StartCmd.java (82%)
 rename Aria/src/main/java/com/arialyy/aria/core/{command/download => download/command}/StopCmd.java (83%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/queue/DownloadTaskQueue.java (77%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/queue/IDownloader.java (66%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/queue/IPool.java (83%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/queue/ITaskQueue.java (78%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/queue/pool/CachePool.java (86%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/queue/pool/ExecutePool.java (85%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/scheduler/DownloadSchedulers.java (92%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/scheduler/IDownloadSchedulers.java (94%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/scheduler/OnSchedulerListener.java (67%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/task/ConnectionHelp.java (96%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/task/DownloadListener.java (96%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/task/DownloadStateConstance.java (97%)
 rename Aria/src/main/java/com/arialyy/aria/core/{task/Task.java => download/task/DownloadTask.java} (93%)
 rename Aria/src/main/java/com/arialyy/aria/core/{task/TaskFactory.java => download/task/DownloadTaskFactory.java} (65%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/task/DownloadUtil.java (98%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/task/IDownloadListener.java (97%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/task/IDownloadUtil.java (94%)
 rename Aria/src/main/java/com/arialyy/aria/core/{ => download}/task/SingleThreadTask.java (99%)
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/inf/ICmd.java
 rename Aria/src/main/java/com/arialyy/aria/core/{ => inf}/IReceiver.java (92%)
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/upload/IUploadListener.java
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/upload/MultipartUtility.java
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/upload/UploadEntity.java
 rename Aria/src/main/java/com/arialyy/aria/core/{ => upload}/UploadReceiver.java (91%)
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/upload/UploadTaskEntity.java
 create mode 100644 Aria/src/main/java/com/arialyy/aria/core/upload/UploadUtil.java
 create mode 100644 app/src/main/java/com/arialyy/simple/upload.java
 create mode 100644 app/src/main/res/layout/activity_upload.xml

diff --git a/.idea/misc.xml b/.idea/misc.xml
index fbb68289..5d199810 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -37,7 +37,7 @@
     
     
   
-  
+  
     
   
   
diff --git a/Aria/src/main/java/com/arialyy/aria/core/Aria.java b/Aria/src/main/java/com/arialyy/aria/core/Aria.java
index 8bd04957..62fd6880 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/Aria.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/Aria.java
@@ -26,8 +26,9 @@ import android.app.Service;
 import android.content.Context;
 import android.os.Build;
 import android.widget.PopupWindow;
-import com.arialyy.aria.core.scheduler.OnSchedulerListener;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadReceiver;
+import com.arialyy.aria.core.download.scheduler.OnSchedulerListener;
+import com.arialyy.aria.core.download.task.DownloadTask;
 
 /**
  * Created by lyy on 2016/12/1.
@@ -143,35 +144,35 @@ import com.arialyy.aria.core.task.Task;
 
   public static class SimpleSchedulerListener implements OnSchedulerListener {
 
-    @Override public void onTaskPre(Task task) {
+    @Override public void onTaskPre(DownloadTask task) {
 
     }
 
-    @Override public void onTaskResume(Task task) {
+    @Override public void onTaskResume(DownloadTask task) {
 
     }
 
-    @Override public void onTaskStart(Task task) {
+    @Override public void onTaskStart(DownloadTask task) {
 
     }
 
-    @Override public void onTaskStop(Task task) {
+    @Override public void onTaskStop(DownloadTask task) {
 
     }
 
-    @Override public void onTaskCancel(Task task) {
+    @Override public void onTaskCancel(DownloadTask task) {
 
     }
 
-    @Override public void onTaskFail(Task task) {
+    @Override public void onTaskFail(DownloadTask task) {
 
     }
 
-    @Override public void onTaskComplete(Task task) {
+    @Override public void onTaskComplete(DownloadTask task) {
 
     }
 
-    @Override public void onTaskRunning(Task task) {
+    @Override public void onTaskRunning(DownloadTask task) {
 
     }
   }
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 95a9711b..cf474214 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java
@@ -27,9 +27,14 @@ import android.support.v4.app.Fragment;
 import android.text.TextUtils;
 import android.util.Log;
 import android.widget.PopupWindow;
-import com.arialyy.aria.core.command.download.IDownloadCmd;
-import com.arialyy.aria.core.queue.DownloadTaskQueue;
-import com.arialyy.aria.core.queue.ITaskQueue;
+import com.arialyy.aria.core.download.command.IDownloadCmd;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadReceiver;
+import com.arialyy.aria.core.inf.ICmd;
+import com.arialyy.aria.core.inf.IReceiver;
+import com.arialyy.aria.core.download.queue.DownloadTaskQueue;
+import com.arialyy.aria.core.download.queue.ITaskQueue;
+import com.arialyy.aria.core.upload.UploadReceiver;
 import com.arialyy.aria.orm.DbEntity;
 import com.arialyy.aria.orm.DbUtil;
 import com.arialyy.aria.util.CAConfiguration;
@@ -56,7 +61,7 @@ import java.util.Map;
 
   public static Context APP;
   private ITaskQueue mTaskQueue;
-  private List mCommands = new ArrayList<>();
+  private List mCommands = new ArrayList<>();
 
   private AriaManager(Context context) {
     DbUtil.init(context.getApplicationContext());
@@ -75,7 +80,11 @@ import java.util.Map;
     return INSTANCE;
   }
 
-  List getAllDownloadEntity() {
+  public Map getReceiver(){
+    return mReceivers;
+  }
+
+  public List getAllDownloadEntity() {
     return DbEntity.findAllData(DownloadEntity.class);
   }
 
@@ -89,7 +98,7 @@ import java.util.Map;
   /**
    * 设置命令
    */
-  AriaManager setCmd(IDownloadCmd command) {
+  public AriaManager setCmd(ICmd command) {
     mCommands.add(command);
     return this;
   }
@@ -97,7 +106,7 @@ import java.util.Map;
   /**
    * 设置一组命令
    */
-  AriaManager setCmds(List commands) {
+  public  AriaManager setCmds(List commands) {
     if (commands != null && commands.size() > 0) {
       mCommands.addAll(commands);
     }
@@ -107,8 +116,8 @@ import java.util.Map;
   /**
    * 执行所有设置的命令
    */
-  synchronized void exe() {
-    for (IDownloadCmd command : mCommands) {
+  public synchronized void exe() {
+    for (ICmd command : mCommands) {
       command.executeCmd();
     }
     mCommands.clear();
diff --git a/Aria/src/main/java/com/arialyy/aria/core/DownloadEntity.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadEntity.java
similarity index 99%
rename from Aria/src/main/java/com/arialyy/aria/core/DownloadEntity.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/DownloadEntity.java
index 53b69824..af97dc53 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/DownloadEntity.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadEntity.java
@@ -15,7 +15,7 @@
  */
 
 
-package com.arialyy.aria.core;
+package com.arialyy.aria.core.download;
 
 import android.os.Parcel;
 import android.os.Parcelable;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/DownloadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java
similarity index 86%
rename from Aria/src/main/java/com/arialyy/aria/core/DownloadReceiver.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java
index 8a2237a8..6979e802 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/DownloadReceiver.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadReceiver.java
@@ -13,13 +13,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core;
+package com.arialyy.aria.core.download;
 
 import android.support.annotation.NonNull;
-import com.arialyy.aria.core.command.download.CmdFactory;
-import com.arialyy.aria.core.command.download.IDownloadCmd;
-import com.arialyy.aria.core.scheduler.DownloadSchedulers;
-import com.arialyy.aria.core.scheduler.OnSchedulerListener;
+import com.arialyy.aria.core.AriaManager;
+import com.arialyy.aria.core.inf.IReceiver;
+import com.arialyy.aria.core.download.command.CmdFactory;
+import com.arialyy.aria.core.download.command.IDownloadCmd;
+import com.arialyy.aria.core.download.scheduler.DownloadSchedulers;
+import com.arialyy.aria.core.download.scheduler.OnSchedulerListener;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
 import java.util.ArrayList;
@@ -30,7 +32,7 @@ import java.util.Set;
  * Created by lyy on 2016/12/5.
  * 下载功能接收器
  */
-public class DownloadReceiver implements IReceiver{
+public class DownloadReceiver implements IReceiver {
   private static final String TAG = "DownloadReceiver";
   public String targetName;
   public OnSchedulerListener listener;
@@ -131,11 +133,11 @@ public class DownloadReceiver implements IReceiver{
           CommonUtil.createDownloadCmd(new DownloadTaskEntity(entity), CmdFactory.TASK_CANCEL));
     }
     ariaManager.setCmds(cancelCmds).exe();
-    Set keys = ariaManager.mReceivers.keySet();
+    Set keys = ariaManager.getReceiver().keySet();
     for (String key : keys) {
-      IReceiver receiver = ariaManager.mReceivers.get(key);
+      IReceiver receiver = ariaManager.getReceiver().get(key);
       receiver.removeSchedulerListener();
-      ariaManager.mReceivers.remove(key);
+      ariaManager.getReceiver().remove(key);
     }
   }
 }
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/DownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
similarity index 95%
rename from Aria/src/main/java/com/arialyy/aria/core/DownloadTarget.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
index 6eae0275..f168d10b 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/DownloadTarget.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java
@@ -13,12 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core;
+package com.arialyy.aria.core.download;
 
 import android.support.annotation.NonNull;
 import android.text.TextUtils;
-import com.arialyy.aria.core.command.download.CmdFactory;
-import com.arialyy.aria.core.command.download.IDownloadCmd;
+import com.arialyy.aria.core.AriaManager;
+import com.arialyy.aria.core.RequestEnum;
+import com.arialyy.aria.core.download.command.CmdFactory;
+import com.arialyy.aria.core.download.command.IDownloadCmd;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
 import java.util.ArrayList;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskEntity.java
similarity index 92%
rename from Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskEntity.java
index 9d15475e..b28ff240 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/DownloadTaskEntity.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTaskEntity.java
@@ -13,8 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core;
+package com.arialyy.aria.core.download;
 
+import com.arialyy.aria.core.RequestEnum;
 import java.util.HashMap;
 import java.util.Map;
 
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/download/AddCmd.java b/Aria/src/main/java/com/arialyy/aria/core/download/command/AddCmd.java
similarity index 82%
rename from Aria/src/main/java/com/arialyy/aria/core/command/download/AddCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/command/AddCmd.java
index 3a919edb..45698636 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/download/AddCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/command/AddCmd.java
@@ -14,12 +14,11 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command.download;
+package com.arialyy.aria.core.download.command;
 
 import android.util.Log;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 
 /**
  * Created by lyy on 2016/8/22.
@@ -36,7 +35,7 @@ class AddCmd extends IDownloadCmd {
   }
 
   @Override public void executeCmd() {
-    Task task = mQueue.getTask(mEntity.downloadEntity);
+    DownloadTask task = mQueue.getTask(mEntity.downloadEntity);
     if (task == null) {
       mQueue.createTask(mTargetName, mEntity);
     } else {
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/download/CancelCmd.java b/Aria/src/main/java/com/arialyy/aria/core/download/command/CancelCmd.java
similarity index 82%
rename from Aria/src/main/java/com/arialyy/aria/core/command/download/CancelCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/command/CancelCmd.java
index 686c1521..a16437da 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/download/CancelCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/command/CancelCmd.java
@@ -14,11 +14,10 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command.download;
+package com.arialyy.aria.core.download.command;
 
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 
 /**
  * Created by lyy on 2016/9/20.
@@ -35,7 +34,7 @@ class CancelCmd extends IDownloadCmd {
   }
 
   @Override public void executeCmd() {
-    Task task = mQueue.getTask(mEntity.downloadEntity);
+    DownloadTask task = mQueue.getTask(mEntity.downloadEntity);
     if (task == null) {
       task = mQueue.createTask(mTargetName, mEntity);
     }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/download/CmdFactory.java b/Aria/src/main/java/com/arialyy/aria/core/download/command/CmdFactory.java
similarity index 96%
rename from Aria/src/main/java/com/arialyy/aria/core/command/download/CmdFactory.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/command/CmdFactory.java
index a6f5f3aa..e248b1bb 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/download/CmdFactory.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/command/CmdFactory.java
@@ -14,10 +14,9 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command.download;
+package com.arialyy.aria.core.download.command;
 
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.DownloadTaskEntity;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
 
 /**
  * Created by Lyy on 2016/9/23.
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java b/Aria/src/main/java/com/arialyy/aria/core/download/command/IDownloadCmd.java
similarity index 79%
rename from Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/command/IDownloadCmd.java
index ea1909a6..b0d47767 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/download/IDownloadCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/command/IDownloadCmd.java
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command.download;
+package com.arialyy.aria.core.download.command;
 
 import com.arialyy.aria.core.AriaManager;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.queue.ITaskQueue;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.queue.ITaskQueue;
+import com.arialyy.aria.core.inf.ICmd;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
 
@@ -26,7 +27,7 @@ import com.arialyy.aria.util.CommonUtil;
  * Created by lyy on 2016/8/22.
  * 下载命令
  */
-public abstract class IDownloadCmd {
+public abstract class IDownloadCmd implements ICmd{
   ITaskQueue mQueue;
   DownloadTaskEntity mEntity;
   String TAG;
@@ -43,17 +44,11 @@ public abstract class IDownloadCmd {
    * @param targetName 产生任务的对象名
    */
   IDownloadCmd(String targetName, DownloadTaskEntity entity) {
-    if (!CheckUtil.checkDownloadEntity(entity.downloadEntity)) {
-      return;
-    }
+    CheckUtil.checkDownloadEntity(entity.downloadEntity);
     mTargetName = targetName;
     mEntity = entity;
     TAG = CommonUtil.getClassName(this);
     mQueue = AriaManager.getInstance(AriaManager.APP).getTaskQueue();
   }
 
-  /**
-   * 执行命令
-   */
-  public abstract void executeCmd();
 }
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/download/SingleCmd.java b/Aria/src/main/java/com/arialyy/aria/core/download/command/SingleCmd.java
similarity index 89%
rename from Aria/src/main/java/com/arialyy/aria/core/command/download/SingleCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/command/SingleCmd.java
index d9eb246e..b816ac00 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/download/SingleCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/command/SingleCmd.java
@@ -16,8 +16,8 @@
 //package com.arialyy.aria.core.command.download;
 //
 //import android.util.Log;
-//import com.arialyy.aria.core.DownloadEntity;
-//import com.arialyy.aria.core.task.Task;
+//import com.arialyy.aria.core.download.DownloadEntity;
+//import com.arialyy.aria.core.task.DownloadTask;
 //
 ///**
 // * Created by lyy on 2016/11/30.
@@ -36,7 +36,7 @@
 //  }
 //
 //  @Override public void executeCmd() {
-//    Task task = mQueue.getTask(mEntity);
+//    DownloadTask task = mQueue.getTask(mEntity);
 //    if (task == null) {
 //      task = mQueue.createTask(mTargetName, mEntity);
 //    } else {
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/download/StartCmd.java b/Aria/src/main/java/com/arialyy/aria/core/download/command/StartCmd.java
similarity index 82%
rename from Aria/src/main/java/com/arialyy/aria/core/command/download/StartCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/command/StartCmd.java
index 038df58e..316db667 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/download/StartCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/command/StartCmd.java
@@ -14,11 +14,10 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command.download;
+package com.arialyy.aria.core.download.command;
 
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 
 /**
  * Created by lyy on 2016/8/22.
@@ -35,7 +34,7 @@ class StartCmd extends IDownloadCmd {
   }
 
   @Override public void executeCmd() {
-    Task task = mQueue.getTask(mEntity.downloadEntity);
+    DownloadTask task = mQueue.getTask(mEntity.downloadEntity);
     if (task == null) {
       task = mQueue.createTask(mTargetName, mEntity);
     }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/download/StopCmd.java b/Aria/src/main/java/com/arialyy/aria/core/download/command/StopCmd.java
similarity index 83%
rename from Aria/src/main/java/com/arialyy/aria/core/command/download/StopCmd.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/command/StopCmd.java
index 1ec50551..2b342757 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/command/download/StopCmd.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/command/StopCmd.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.command.download;
+package com.arialyy.aria.core.download.command;
 
 import android.text.TextUtils;
 import android.util.Log;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 
 /**
  * Created by lyy on 2016/9/20.
@@ -37,7 +37,7 @@ class StopCmd extends IDownloadCmd {
   }
 
   @Override public void executeCmd() {
-    Task task = mQueue.getTask(mEntity.downloadEntity);
+    DownloadTask task = mQueue.getTask(mEntity.downloadEntity);
     if (task == null) {
       if (mEntity.downloadEntity.getState() == DownloadEntity.STATE_DOWNLOAD_ING) {
         task = mQueue.createTask(mTargetName, mEntity);
diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/download/queue/DownloadTaskQueue.java
similarity index 77%
rename from Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/queue/DownloadTaskQueue.java
index 52dc5e0f..346902af 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/queue/DownloadTaskQueue.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/queue/DownloadTaskQueue.java
@@ -14,18 +14,18 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.queue;
+package com.arialyy.aria.core.download.queue;
 
 import android.content.Context;
 import android.text.TextUtils;
 import android.util.Log;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.queue.pool.CachePool;
-import com.arialyy.aria.core.queue.pool.ExecutePool;
-import com.arialyy.aria.core.scheduler.DownloadSchedulers;
-import com.arialyy.aria.core.task.Task;
-import com.arialyy.aria.core.task.TaskFactory;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.queue.pool.CachePool;
+import com.arialyy.aria.core.download.queue.pool.ExecutePool;
+import com.arialyy.aria.core.download.scheduler.DownloadSchedulers;
+import com.arialyy.aria.core.download.task.DownloadTask;
+import com.arialyy.aria.core.download.task.DownloadTaskFactory;
 import com.arialyy.aria.util.Configuration;
 
 /**
@@ -79,7 +79,7 @@ public class DownloadTaskQueue implements ITaskQueue {
     return mCachePool.size();
   }
 
-  @Override public void startTask(Task task) {
+  @Override public void startTask(DownloadTask task) {
     if (mExecutePool.putTask(task)) {
       mCachePool.removeTask(task);
       task.getDownloadEntity().setFailNum(0);
@@ -87,7 +87,7 @@ public class DownloadTaskQueue implements ITaskQueue {
     }
   }
 
-  @Override public void stopTask(Task task) {
+  @Override public void stopTask(DownloadTask task) {
     if (!task.isDownloading()) Log.w(TAG, "停止任务失败,【任务已经停止】");
     if (mExecutePool.removeTask(task)) {
       task.stop();
@@ -97,11 +97,11 @@ public class DownloadTaskQueue implements ITaskQueue {
     }
   }
 
-  @Override public void cancelTask(Task task) {
+  @Override public void cancelTask(DownloadTask task) {
     task.cancel();
   }
 
-  @Override public void reTryStart(Task task) {
+  @Override public void reTryStart(DownloadTask task) {
     if (task == null) {
       Log.w(TAG, "重试下载失败,task 为null");
       return;
@@ -128,7 +128,7 @@ public class DownloadTaskQueue implements ITaskQueue {
     //设置的任务数小于配置任务数
     if (diff <= -1 && mExecutePool.size() >= size) {
       for (int i = 0, len = Math.abs(diff); i < len; i++) {
-        Task eTask = mExecutePool.pollTask();
+        DownloadTask eTask = mExecutePool.pollTask();
         if (eTask != null) {
           stopTask(eTask);
         }
@@ -137,7 +137,7 @@ public class DownloadTaskQueue implements ITaskQueue {
     mExecutePool.setDownloadNum(downloadNum);
     if (diff >= 1) {
       for (int i = 0; i < diff; i++) {
-        Task nextTask = getNextTask();
+        DownloadTask nextTask = getNextTask();
         if (nextTask != null
             && nextTask.getDownloadEntity().getState() == DownloadEntity.STATE_WAIT) {
           startTask(nextTask);
@@ -146,21 +146,21 @@ public class DownloadTaskQueue implements ITaskQueue {
     }
   }
 
-  @Override public Task createTask(String target, DownloadTaskEntity entity) {
-    Task task;
+  @Override public DownloadTask createTask(String target, DownloadTaskEntity entity) {
+    DownloadTask task;
     if (TextUtils.isEmpty(target)) {
       task =
-          TaskFactory.getInstance().createTask(mContext, entity, DownloadSchedulers.getInstance());
+          DownloadTaskFactory.getInstance().createTask(mContext, entity, DownloadSchedulers.getInstance());
     } else {
-      task = TaskFactory.getInstance()
+      task = DownloadTaskFactory.getInstance()
           .createTask(target, mContext, entity, DownloadSchedulers.getInstance());
     }
     mCachePool.putTask(task);
     return task;
   }
 
-  @Override public Task getTask(DownloadEntity entity) {
-    Task task = mExecutePool.getTask(entity.getDownloadUrl());
+  @Override public DownloadTask getTask(DownloadEntity entity) {
+    DownloadTask task = mExecutePool.getTask(entity.getDownloadUrl());
     if (task == null) {
       task = mCachePool.getTask(entity.getDownloadUrl());
     }
@@ -168,7 +168,7 @@ public class DownloadTaskQueue implements ITaskQueue {
   }
 
   @Override public void removeTask(DownloadEntity entity) {
-    Task task = mExecutePool.getTask(entity.getDownloadUrl());
+    DownloadTask task = mExecutePool.getTask(entity.getDownloadUrl());
     if (task != null) {
       Log.d(TAG, "从执行池删除任务,删除" + (mExecutePool.removeTask(task) ? "成功" : "失败"));
     }
@@ -178,7 +178,7 @@ public class DownloadTaskQueue implements ITaskQueue {
     }
   }
 
-  @Override public Task getNextTask() {
+  @Override public DownloadTask getNextTask() {
     return mCachePool.pollTask();
   }
 
diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/IDownloader.java b/Aria/src/main/java/com/arialyy/aria/core/download/queue/IDownloader.java
similarity index 66%
rename from Aria/src/main/java/com/arialyy/aria/core/queue/IDownloader.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/queue/IDownloader.java
index 601e54ed..cf855db2 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/queue/IDownloader.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/queue/IDownloader.java
@@ -15,9 +15,9 @@
  */
 
 
-package com.arialyy.aria.core.queue;
+package com.arialyy.aria.core.download.queue;
 
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.task.DownloadTask;
 
 /**
  * Created by lyy on 2016/8/16.
@@ -27,28 +27,28 @@ public interface IDownloader {
   /**
    * 开始任务
    *
-   * @param task {@link Task}
+   * @param task {@link DownloadTask}
    */
-  public void startTask(Task task);
+  public void startTask(DownloadTask task);
 
   /**
    * 停止任务
    *
-   * @param task {@link Task}
+   * @param task {@link DownloadTask}
    */
-  public void stopTask(Task task);
+  public void stopTask(DownloadTask task);
 
   /**
    * 取消任务
    *
-   * @param task {@link Task}
+   * @param task {@link DownloadTask}
    */
-  public void cancelTask(Task task);
+  public void cancelTask(DownloadTask task);
 
   /**
    * 重试下载
    *
-   * @param task {@link Task}
+   * @param task {@link DownloadTask}
    */
-  public void reTryStart(Task task);
+  public void reTryStart(DownloadTask task);
 }
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/IPool.java b/Aria/src/main/java/com/arialyy/aria/core/download/queue/IPool.java
similarity index 83%
rename from Aria/src/main/java/com/arialyy/aria/core/queue/IPool.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/queue/IPool.java
index f41258f4..722353fa 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/queue/IPool.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/queue/IPool.java
@@ -15,9 +15,9 @@
  */
 
 
-package com.arialyy.aria.core.queue;
+package com.arialyy.aria.core.download.queue;
 
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.task.DownloadTask;
 
 /**
  * Created by lyy on 2016/8/14.
@@ -27,14 +27,14 @@ public interface IPool {
   /**
    * 将下载任务添加到任务池中
    */
-  public boolean putTask(Task task);
+  public boolean putTask(DownloadTask task);
 
   /**
    * 按照队列原则取出下载任务
    *
    * @return 返回null或者下载任务
    */
-  public Task pollTask();
+  public DownloadTask pollTask();
 
   /**
    * 通过下载链接获取下载任务,当任务不为空时,队列将删除该下载任务
@@ -42,7 +42,7 @@ public interface IPool {
    * @param downloadUrl 下载链接
    * @return 返回null或者下载任务
    */
-  public Task getTask(String downloadUrl);
+  public DownloadTask getTask(String downloadUrl);
 
   /**
    * 删除任务池中的下载任务
@@ -50,7 +50,7 @@ public interface IPool {
    * @param task 下载任务
    * @return true:移除成功
    */
-  public boolean removeTask(Task task);
+  public boolean removeTask(DownloadTask task);
 
   /**
    * 通过下载链接移除下载任务
diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java b/Aria/src/main/java/com/arialyy/aria/core/download/queue/ITaskQueue.java
similarity index 78%
rename from Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/queue/ITaskQueue.java
index 58ad3260..3cc29ff5 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/queue/ITaskQueue.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/queue/ITaskQueue.java
@@ -14,12 +14,11 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.queue;
+package com.arialyy.aria.core.download.queue;
 
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.scheduler.IDownloadSchedulers;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 
 /**
  * Created by lyy on 2016/8/16.
@@ -49,17 +48,17 @@ public interface ITaskQueue extends IDownloader {
    *
    * @param entity 下载实体{@link DownloadTaskEntity}
    * @param targetName 生成该任务的对象
-   * @return {@link Task}
+   * @return {@link DownloadTask}
    */
-  public Task createTask(String targetName, DownloadTaskEntity entity);
+  public DownloadTask createTask(String targetName, DownloadTaskEntity entity);
 
   /**
    * 通过下载链接从缓存池或任务池搜索下载任务,如果缓存池或任务池都没有任务,则创建新任务
    *
    * @param entity 下载实体{@link DownloadEntity}
-   * @return {@link Task}
+   * @return {@link DownloadTask}
    */
-  public Task getTask(DownloadEntity entity);
+  public DownloadTask getTask(DownloadEntity entity);
 
   /**
    * 通过下载链接删除任务
@@ -73,5 +72,5 @@ public interface ITaskQueue extends IDownloader {
    *
    * @return 下载任务 or null
    */
-  public Task getNextTask();
+  public DownloadTask getNextTask();
 }
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/pool/CachePool.java b/Aria/src/main/java/com/arialyy/aria/core/download/queue/pool/CachePool.java
similarity index 86%
rename from Aria/src/main/java/com/arialyy/aria/core/queue/pool/CachePool.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/queue/pool/CachePool.java
index 8f710491..1d860a48 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/queue/pool/CachePool.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/queue/pool/CachePool.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.queue.pool;
+package com.arialyy.aria.core.download.queue.pool;
 
 import android.text.TextUtils;
 import android.util.Log;
-import com.arialyy.aria.core.queue.IPool;
+import com.arialyy.aria.core.download.queue.IPool;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.aria.util.CommonUtil;
-import com.arialyy.aria.core.task.Task;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -36,8 +36,8 @@ public class CachePool implements IPool {
   private static final    int       MAX_NUM  = Integer.MAX_VALUE;  //最大下载任务数
   private static volatile CachePool INSTANCE = null;
   private static final    long      TIME_OUT = 1000;
-  private Map         mCacheArray;
-  private LinkedBlockingQueue mCacheQueue;
+  private Map         mCacheArray;
+  private LinkedBlockingQueue mCacheQueue;
 
   private CachePool() {
     mCacheQueue = new LinkedBlockingQueue<>(MAX_NUM);
@@ -53,7 +53,7 @@ public class CachePool implements IPool {
     return INSTANCE;
   }
 
-  @Override public boolean putTask(Task task) {
+  @Override public boolean putTask(DownloadTask task) {
     synchronized (LOCK) {
       if (task == null) {
         Log.e(TAG, "下载任务不能为空!!");
@@ -74,10 +74,10 @@ public class CachePool implements IPool {
     }
   }
 
-  @Override public Task pollTask() {
+  @Override public DownloadTask pollTask() {
     synchronized (LOCK) {
       try {
-        Task task = null;
+        DownloadTask task = null;
         task = mCacheQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
         if (task != null) {
           String url = task.getDownloadEntity().getDownloadUrl();
@@ -91,7 +91,7 @@ public class CachePool implements IPool {
     return null;
   }
 
-  @Override public Task getTask(String downloadUrl) {
+  @Override public DownloadTask getTask(String downloadUrl) {
     synchronized (LOCK) {
       if (TextUtils.isEmpty(downloadUrl)) {
         Log.e(TAG, "请传入有效的下载链接");
@@ -102,7 +102,7 @@ public class CachePool implements IPool {
     }
   }
 
-  @Override public boolean removeTask(Task task) {
+  @Override public boolean removeTask(DownloadTask task) {
     synchronized (LOCK) {
       if (task == null) {
         Log.e(TAG, "任务不能为空");
@@ -122,7 +122,7 @@ public class CachePool implements IPool {
         return false;
       }
       String key  = CommonUtil.keyToHashKey(downloadUrl);
-      Task   task = mCacheArray.get(key);
+      DownloadTask task = mCacheArray.get(key);
       mCacheArray.remove(key);
       return mCacheQueue.remove(task);
     }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/pool/ExecutePool.java b/Aria/src/main/java/com/arialyy/aria/core/download/queue/pool/ExecutePool.java
similarity index 85%
rename from Aria/src/main/java/com/arialyy/aria/core/queue/pool/ExecutePool.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/queue/pool/ExecutePool.java
index a3a1c911..1dc36d9a 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/queue/pool/ExecutePool.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/queue/pool/ExecutePool.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.queue.pool;
+package com.arialyy.aria.core.download.queue.pool;
 
 import android.text.TextUtils;
 import android.util.Log;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.aria.util.CommonUtil;
-import com.arialyy.aria.core.queue.IPool;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.queue.IPool;
 import com.arialyy.aria.util.Configuration;
 import java.util.HashMap;
 import java.util.Map;
@@ -36,8 +36,8 @@ public class ExecutePool implements IPool {
   private static final    Object      LOCK     = new Object();
   private static final    long        TIME_OUT = 1000;
   private static volatile ExecutePool INSTANCE = null;
-  private ArrayBlockingQueue mExecuteQueue;
-  private Map        mExecuteArray;
+  private ArrayBlockingQueue mExecuteQueue;
+  private Map        mExecuteArray;
   private int                      mSize;
 
   private ExecutePool() {
@@ -55,7 +55,7 @@ public class ExecutePool implements IPool {
     return INSTANCE;
   }
 
-  @Override public boolean putTask(Task task) {
+  @Override public boolean putTask(DownloadTask task) {
     synchronized (LOCK) {
       if (task == null) {
         Log.e(TAG, "下载任务不能为空!!");
@@ -85,8 +85,8 @@ public class ExecutePool implements IPool {
    */
   public void setDownloadNum(int downloadNum) {
     try {
-      ArrayBlockingQueue temp = new ArrayBlockingQueue<>(downloadNum);
-      Task                     task;
+      ArrayBlockingQueue temp = new ArrayBlockingQueue<>(downloadNum);
+      DownloadTask task;
       while ((task = mExecuteQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS)) != null) {
         temp.offer(task);
       }
@@ -103,7 +103,7 @@ public class ExecutePool implements IPool {
    *
    * @param newTask 新下载任务
    */
-  private boolean putNewTask(Task newTask) {
+  private boolean putNewTask(DownloadTask newTask) {
     String  url = newTask.getDownloadEntity().getDownloadUrl();
     boolean s   = mExecuteQueue.offer(newTask);
     Log.w(TAG, "任务添加" + (s ? "成功" : "失败,【" + url + "】"));
@@ -119,7 +119,7 @@ public class ExecutePool implements IPool {
    */
   private boolean pollFirstTask() {
     try {
-      Task oldTask = mExecuteQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
+      DownloadTask oldTask = mExecuteQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
       if (oldTask == null) {
         Log.e(TAG, "移除任务失败");
         return false;
@@ -135,10 +135,10 @@ public class ExecutePool implements IPool {
     return true;
   }
 
-  @Override public Task pollTask() {
+  @Override public DownloadTask pollTask() {
     synchronized (LOCK) {
       try {
-        Task task = null;
+        DownloadTask task = null;
         task = mExecuteQueue.poll(TIME_OUT, TimeUnit.MICROSECONDS);
         if (task != null) {
           String url = task.getDownloadEntity().getDownloadUrl();
@@ -152,7 +152,7 @@ public class ExecutePool implements IPool {
     }
   }
 
-  @Override public Task getTask(String downloadUrl) {
+  @Override public DownloadTask getTask(String downloadUrl) {
     synchronized (LOCK) {
       if (TextUtils.isEmpty(downloadUrl)) {
         Log.e(TAG, "请传入有效的下载链接");
@@ -163,7 +163,7 @@ public class ExecutePool implements IPool {
     }
   }
 
-  @Override public boolean removeTask(Task task) {
+  @Override public boolean removeTask(DownloadTask task) {
     synchronized (LOCK) {
       if (task == null) {
         Log.e(TAG, "任务不能为空");
@@ -183,7 +183,7 @@ public class ExecutePool implements IPool {
         return false;
       }
       String key  = CommonUtil.keyToHashKey(downloadUrl);
-      Task   task = mExecuteArray.get(key);
+      DownloadTask task = mExecuteArray.get(key);
       mExecuteArray.remove(key);
       return mExecuteQueue.remove(task);
     }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java b/Aria/src/main/java/com/arialyy/aria/core/download/scheduler/DownloadSchedulers.java
similarity index 92%
rename from Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/scheduler/DownloadSchedulers.java
index 3a11b779..f9db071b 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/scheduler/DownloadSchedulers.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/scheduler/DownloadSchedulers.java
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.scheduler;
+package com.arialyy.aria.core.download.scheduler;
 
 import android.os.CountDownTimer;
 import android.os.Message;
 import android.util.Log;
 import com.arialyy.aria.core.AriaManager;
-import com.arialyy.aria.core.queue.ITaskQueue;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.queue.ITaskQueue;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.aria.util.Configuration;
 import java.util.Iterator;
 import java.util.Map;
@@ -108,7 +108,7 @@ public class DownloadSchedulers implements IDownloadSchedulers {
   }
 
   @Override public boolean handleMessage(Message msg) {
-    Task task = (Task) msg.obj;
+    DownloadTask task = (DownloadTask) msg.obj;
     if (task == null) {
       Log.e(TAG, "请传入下载任务");
       return true;
@@ -140,7 +140,7 @@ public class DownloadSchedulers implements IDownloadSchedulers {
    *
    * @param state 状态
    */
-  private void callback(int state, Task task) {
+  private void callback(int state, DownloadTask task) {
     if (mSchedulerListeners.size() > 0) {
       //if (!TextUtils.isEmpty(task.getTargetName())) {
       //  callback(state, task, mSchedulerListeners.get(task.getTargetName()));
@@ -152,7 +152,7 @@ public class DownloadSchedulers implements IDownloadSchedulers {
     }
   }
 
-  private void callback(int state, Task task, OnSchedulerListener listener) {
+  private void callback(int state, DownloadTask task, OnSchedulerListener listener) {
     if (listener != null) {
       if (task == null) {
         Log.e(TAG, "TASK 为null,回调失败");
@@ -201,7 +201,7 @@ public class DownloadSchedulers implements IDownloadSchedulers {
 
       @Override public void onFinish() {
         if (entity.getFailNum() <= config.getReTryNum()) {
-          Task task = mQueue.getTask(entity);
+          DownloadTask task = mQueue.getTask(entity);
           mQueue.reTryStart(task);
           try {
             Thread.sleep(config.getReTryInterval());
@@ -222,7 +222,7 @@ public class DownloadSchedulers implements IDownloadSchedulers {
    * @param entity 通过Handler传递的下载实体
    */
   @Override public void startNextTask(DownloadEntity entity) {
-    Task newTask = mQueue.getNextTask();
+    DownloadTask newTask = mQueue.getNextTask();
     if (newTask == null) {
       Log.w(TAG, "没有下一任务");
       return;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/scheduler/IDownloadSchedulers.java b/Aria/src/main/java/com/arialyy/aria/core/download/scheduler/IDownloadSchedulers.java
similarity index 94%
rename from Aria/src/main/java/com/arialyy/aria/core/scheduler/IDownloadSchedulers.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/scheduler/IDownloadSchedulers.java
index 5b38ceb5..98997122 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/scheduler/IDownloadSchedulers.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/scheduler/IDownloadSchedulers.java
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.scheduler;
+package com.arialyy.aria.core.download.scheduler;
 
 import android.os.Handler;
-import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadEntity;
 
 /**
  * Created by “AriaLyy@outlook.com” on 2016/11/2.
diff --git a/Aria/src/main/java/com/arialyy/aria/core/scheduler/OnSchedulerListener.java b/Aria/src/main/java/com/arialyy/aria/core/download/scheduler/OnSchedulerListener.java
similarity index 67%
rename from Aria/src/main/java/com/arialyy/aria/core/scheduler/OnSchedulerListener.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/scheduler/OnSchedulerListener.java
index baa584af..c83d2839 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/scheduler/OnSchedulerListener.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/scheduler/OnSchedulerListener.java
@@ -13,9 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core.scheduler;
+package com.arialyy.aria.core.download.scheduler;
 
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.task.DownloadTask;
 
 /**
  * Target处理任务监听
@@ -24,40 +24,40 @@ public interface OnSchedulerListener {
   /**
    * 任务预加载
    */
-  public void onTaskPre(Task task);
+  public void onTaskPre(DownloadTask task);
 
   /**
    * 任务恢复下载
    */
-  public void onTaskResume(Task task);
+  public void onTaskResume(DownloadTask task);
 
   /**
    * 任务开始
    */
-  public void onTaskStart(Task task);
+  public void onTaskStart(DownloadTask task);
 
   /**
    * 任务停止
    */
-  public void onTaskStop(Task task);
+  public void onTaskStop(DownloadTask task);
 
   /**
    * 任务取消
    */
-  public void onTaskCancel(Task task);
+  public void onTaskCancel(DownloadTask task);
 
   /**
    * 任务下载失败
    */
-  public void onTaskFail(Task task);
+  public void onTaskFail(DownloadTask task);
 
   /**
    * 任务完成
    */
-  public void onTaskComplete(Task task);
+  public void onTaskComplete(DownloadTask task);
 
   /**
    * 任务执行中
    */
-  public void onTaskRunning(Task task);
+  public void onTaskRunning(DownloadTask task);
 }
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java b/Aria/src/main/java/com/arialyy/aria/core/download/task/ConnectionHelp.java
similarity index 96%
rename from Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/task/ConnectionHelp.java
index bf0b44e9..1f6bd47a 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/ConnectionHelp.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/task/ConnectionHelp.java
@@ -13,9 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core.task;
+package com.arialyy.aria.core.download.task;
 
-import com.arialyy.aria.core.DownloadTaskEntity;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
 import com.arialyy.aria.util.CAConfiguration;
 import com.arialyy.aria.util.SSLContextUtil;
 import java.io.IOException;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadListener.java b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadListener.java
similarity index 96%
rename from Aria/src/main/java/com/arialyy/aria/core/task/DownloadListener.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadListener.java
index bab38eae..e012df53 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadListener.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadListener.java
@@ -15,7 +15,7 @@
  */
 
 
-package com.arialyy.aria.core.task;
+package com.arialyy.aria.core.download.task;
 
 class DownloadListener implements IDownloadListener {
 
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadStateConstance.java b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadStateConstance.java
similarity index 97%
rename from Aria/src/main/java/com/arialyy/aria/core/task/DownloadStateConstance.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadStateConstance.java
index 00da093b..785312bc 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadStateConstance.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadStateConstance.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core.task;
+package com.arialyy.aria.core.download.task;
 
 /**
  * Created by lyy on 2017/1/18.
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/Task.java b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadTask.java
similarity index 93%
rename from Aria/src/main/java/com/arialyy/aria/core/task/Task.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadTask.java
index 5f930cb3..b56defad 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/Task.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadTask.java
@@ -14,17 +14,17 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.task;
+package com.arialyy.aria.core.download.task;
 
 import android.content.Context;
 import android.content.Intent;
 import android.os.Handler;
 import android.util.Log;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.scheduler.DownloadSchedulers;
-import com.arialyy.aria.core.scheduler.IDownloadSchedulers;
-import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.scheduler.DownloadSchedulers;
+import com.arialyy.aria.core.download.scheduler.IDownloadSchedulers;
+import com.arialyy.aria.core.download.DownloadEntity;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
 import com.arialyy.aria.util.Configuration;
@@ -34,8 +34,8 @@ import java.lang.ref.WeakReference;
  * Created by lyy on 2016/8/11.
  * 下载任务类
  */
-public class Task {
-  public static final String TAG = "Task";
+public class DownloadTask {
+  public static final String TAG = "DownloadTask";
   /**
    * 产生该任务对象的hash码
    */
@@ -47,7 +47,7 @@ public class Task {
   private Context mContext;
   private IDownloadUtil mUtil;
 
-  private Task(Context context, DownloadTaskEntity taskEntity, Handler outHandler) {
+  private DownloadTask(Context context, DownloadTaskEntity taskEntity, Handler outHandler) {
     mContext = context.getApplicationContext();
     mTaskEntity = taskEntity;
     mEntity = taskEntity.downloadEntity;
@@ -199,8 +199,8 @@ public class Task {
       return this;
     }
 
-    public Task build() {
-      Task task = new Task(context, taskEntity, outHandler);
+    public DownloadTask build() {
+      DownloadTask task = new DownloadTask(context, taskEntity, outHandler);
       task.setTargetName(targetName);
       taskEntity.downloadEntity.save();
       return task;
@@ -212,7 +212,7 @@ public class Task {
    */
   private static class DListener extends DownloadListener {
     WeakReference outHandler;
-    WeakReference wTask;
+    WeakReference wTask;
     Context context;
     Intent sendIntent;
     long INTERVAL = 1024 * 10;   //10k大小的间隔
@@ -221,9 +221,9 @@ public class Task {
     long INTERVAL_TIME = 1000;   //1m更新周期
     boolean isFirst = true;
     DownloadEntity downloadEntity;
-    Task task;
+    DownloadTask task;
 
-    DListener(Context context, Task task, Handler outHandler) {
+    DListener(Context context, DownloadTask task, Handler outHandler) {
       this.context = context;
       this.outHandler = new WeakReference<>(outHandler);
       this.wTask = new WeakReference<>(task);
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/TaskFactory.java b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadTaskFactory.java
similarity index 65%
rename from Aria/src/main/java/com/arialyy/aria/core/task/TaskFactory.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadTaskFactory.java
index a27217fb..2ac06054 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/TaskFactory.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadTaskFactory.java
@@ -14,30 +14,30 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.task;
+package com.arialyy.aria.core.download.task;
 
 import android.content.Context;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.scheduler.IDownloadSchedulers;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.scheduler.IDownloadSchedulers;
 
 /**
  * Created by lyy on 2016/8/18.
  * 任务工厂
  */
-public class TaskFactory {
-  private static final String TAG = "TaskFactory";
+public class DownloadTaskFactory {
+  private static final String TAG = "DownloadTaskFactory";
 
   private static final Object LOCK = new Object();
-  private static volatile TaskFactory INSTANCE = null;
+  private static volatile DownloadTaskFactory INSTANCE = null;
 
-  private TaskFactory() {
+  private DownloadTaskFactory() {
 
   }
 
-  public static TaskFactory getInstance() {
+  public static DownloadTaskFactory getInstance() {
     if (INSTANCE == null) {
       synchronized (LOCK) {
-        INSTANCE = new TaskFactory();
+        INSTANCE = new DownloadTaskFactory();
       }
     }
     return INSTANCE;
@@ -49,7 +49,7 @@ public class TaskFactory {
    * @param entity 下载任务实体{@link DownloadTaskEntity}
    * @param schedulers {@link IDownloadSchedulers}
    */
-  public Task createTask(Context context, DownloadTaskEntity entity,
+  public DownloadTask createTask(Context context, DownloadTaskEntity entity,
       IDownloadSchedulers schedulers) {
     return createTask("", context, entity, schedulers);
   }
@@ -58,9 +58,9 @@ public class TaskFactory {
    * @param entity 下载任务实体{@link DownloadTaskEntity}
    * @param schedulers {@link IDownloadSchedulers}
    */
-  public Task createTask(String targetName, Context context, DownloadTaskEntity entity,
+  public DownloadTask createTask(String targetName, Context context, DownloadTaskEntity entity,
       IDownloadSchedulers schedulers) {
-    Task.Builder builder = new Task.Builder(targetName, context, entity);
+    DownloadTask.Builder builder = new DownloadTask.Builder(targetName, context, entity);
     builder.setOutHandler(schedulers);
     return builder.build();
   }
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadUtil.java
similarity index 98%
rename from Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadUtil.java
index b38db976..cabef40a 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/DownloadUtil.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/task/DownloadUtil.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.task;
+package com.arialyy.aria.core.download.task;
 
 import android.content.Context;
 import android.util.Log;
 import android.util.SparseArray;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.DownloadTaskEntity;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
 import com.arialyy.aria.util.CheckUtil;
 import com.arialyy.aria.util.CommonUtil;
 import java.io.File;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/IDownloadListener.java b/Aria/src/main/java/com/arialyy/aria/core/download/task/IDownloadListener.java
similarity index 97%
rename from Aria/src/main/java/com/arialyy/aria/core/task/IDownloadListener.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/task/IDownloadListener.java
index 037bd808..d63d52b3 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/IDownloadListener.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/task/IDownloadListener.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.arialyy.aria.core.task;
+package com.arialyy.aria.core.download.task;
 
 /**
  * 下载监听
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/IDownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/task/IDownloadUtil.java
similarity index 94%
rename from Aria/src/main/java/com/arialyy/aria/core/task/IDownloadUtil.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/task/IDownloadUtil.java
index 5c4e29f6..348d9051 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/IDownloadUtil.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/task/IDownloadUtil.java
@@ -15,13 +15,13 @@
  */
 
 
-package com.arialyy.aria.core.task;
+package com.arialyy.aria.core.download.task;
 
 /**
  * Created by “AriaLyy@outlook.com” on 2016/10/31.
  * 抽象的下载接口
  */
-public interface IDownloadUtil {
+interface IDownloadUtil {
 
   /**
    * 获取当前下载位置
diff --git a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/task/SingleThreadTask.java
similarity index 99%
rename from Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java
rename to Aria/src/main/java/com/arialyy/aria/core/download/task/SingleThreadTask.java
index 2f6afc82..8b954b41 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/task/SingleThreadTask.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/download/task/SingleThreadTask.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core.task;
+package com.arialyy.aria.core.download.task;
 
 import android.util.Log;
 import com.arialyy.aria.util.CommonUtil;
diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/ICmd.java b/Aria/src/main/java/com/arialyy/aria/core/inf/ICmd.java
new file mode 100644
index 00000000..9b9b2528
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/ICmd.java
@@ -0,0 +1,12 @@
+package com.arialyy.aria.core.inf;
+
+/**
+ * Created by Aria.Lao on 2017/2/9.
+ */
+
+public interface ICmd {
+  /**
+   * 执行命令
+   */
+  public abstract void executeCmd();
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/IReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/inf/IReceiver.java
similarity index 92%
rename from Aria/src/main/java/com/arialyy/aria/core/IReceiver.java
rename to Aria/src/main/java/com/arialyy/aria/core/inf/IReceiver.java
index 6aebd8c4..8ead3163 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/IReceiver.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/inf/IReceiver.java
@@ -13,12 +13,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core;
+package com.arialyy.aria.core.inf;
 
 /**
  * Created by Aria.Lao on 2017/2/6.
  */
-interface IReceiver {
+public interface IReceiver {
   /**
    * Receiver 销毁
    */
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/IUploadListener.java b/Aria/src/main/java/com/arialyy/aria/core/upload/IUploadListener.java
new file mode 100644
index 00000000..98f7e6ad
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/IUploadListener.java
@@ -0,0 +1,11 @@
+package com.arialyy.aria.core.upload;
+
+/**
+ * Created by Aria.Lao on 2017/2/9.
+ * 上传监听
+ */
+
+public interface IUploadListener {
+
+  public void onFail();
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/MultipartUtility.java b/Aria/src/main/java/com/arialyy/aria/core/upload/MultipartUtility.java
new file mode 100644
index 00000000..fa6cd613
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/MultipartUtility.java
@@ -0,0 +1,150 @@
+package com.arialyy.aria.core.upload;
+
+import android.util.Log;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+
+public class MultipartUtility {
+
+    private final String boundary;
+    private static final String LINE_FEED = "\r\n";
+    private HttpURLConnection httpConn;
+    private String charset;
+    private OutputStream outputStream;
+    private PrintWriter writer;
+
+    /**
+     * This constructor initializes a new HTTP POST request with content type
+     * is set to multipart/form-data
+     *
+     * @param requestURL
+     * @param charset
+     * @throws IOException
+     */
+    public MultipartUtility(String requestURL, String charset)
+            throws IOException {
+        this.charset = charset;
+
+        // creates a unique boundary based on time stamp
+        boundary = "===" + System.currentTimeMillis() + "===";
+
+        URL url = new URL(requestURL);
+        Log.e("URL", "URL : " + requestURL.toString());
+        httpConn = (HttpURLConnection) url.openConnection();
+        httpConn.setUseCaches(false);
+        httpConn.setDoOutput(true); // indicates POST method
+        httpConn.setDoInput(true);
+        httpConn.setRequestProperty("Content-Type",
+                "multipart/form-data; boundary=" + boundary);
+        httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
+        httpConn.setRequestProperty("Test", "Bonjour");
+        outputStream = httpConn.getOutputStream();
+        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
+                true);
+    }
+
+    /**
+     * Adds a form field to the request
+     *
+     * @param name  field name
+     * @param value field value
+     */
+    public void addFormField(String name, String value) {
+        writer.append("--" + boundary).append(LINE_FEED);
+        writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
+                .append(LINE_FEED);
+        writer.append("Content-Type: text/plain; charset=" + charset).append(
+                LINE_FEED);
+        writer.append(LINE_FEED);
+        writer.append(value).append(LINE_FEED);
+        writer.flush();
+    }
+
+    /**
+     * Adds a upload file section to the request
+     *
+     * @param fieldName  name attribute in 
+     * @param uploadFile a File to be uploaded
+     * @throws IOException
+     */
+    public void addFilePart(String fieldName, File uploadFile)
+            throws IOException {
+        String fileName = uploadFile.getName();
+        writer.append("--" + boundary).append(LINE_FEED);
+        writer.append(
+                "Content-Disposition: form-data; name=\"" + fieldName
+                        + "\"; filename=\"" + fileName + "\"")
+                .append(LINE_FEED);
+        writer.append(
+                "Content-Type: "
+                        + URLConnection.guessContentTypeFromName(fileName))
+                .append(LINE_FEED);
+        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
+        writer.append(LINE_FEED);
+        writer.flush();
+
+        FileInputStream inputStream = new FileInputStream(uploadFile);
+        byte[] buffer = new byte[4096];
+        int bytesRead = -1;
+        while ((bytesRead = inputStream.read(buffer)) != -1) {
+            outputStream.write(buffer, 0, bytesRead);
+        }
+        outputStream.flush();
+        inputStream.close();
+
+        writer.append(LINE_FEED);
+        writer.flush();
+    }
+
+    /**
+     * Adds a header field to the request.
+     *
+     * @param name  - name of the header field
+     * @param value - value of the header field
+     */
+    public void addHeaderField(String name, String value) {
+        writer.append(name + ": " + value).append(LINE_FEED);
+        writer.flush();
+    }
+
+    /**
+     * Completes the request and receives response from the server.
+     *
+     * @return a list of Strings as response in case the server returned
+     * status OK, otherwise an exception is thrown.
+     * @throws IOException
+     */
+    public String finish() throws IOException {
+        StringBuffer response = new StringBuffer();
+
+        writer.append(LINE_FEED).flush();
+        writer.append("--" + boundary + "--").append(LINE_FEED);
+        writer.close();
+
+        // checks server's status code first
+        int status = httpConn.getResponseCode();
+        if (status == HttpURLConnection.HTTP_OK) {
+            BufferedReader reader = new BufferedReader(new InputStreamReader(
+                    httpConn.getInputStream()));
+            String line = null;
+            while ((line = reader.readLine()) != null) {
+                response.append(line);
+            }
+            reader.close();
+            httpConn.disconnect();
+        } else {
+            throw new IOException("Server returned non-OK status: " + status);
+        }
+
+        return response.toString();
+    }
+}
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadEntity.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadEntity.java
new file mode 100644
index 00000000..014aba7a
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadEntity.java
@@ -0,0 +1,30 @@
+package com.arialyy.aria.core.upload;
+
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.orm.DbEntity;
+
+/**
+ * Created by Aria.Lao on 2017/2/9.
+ * 上传文件实体
+ */
+public class UploadEntity {
+
+  private String filePath;  //文件路径
+  private String fileName;  //文件名
+
+  public String getFilePath() {
+    return filePath;
+  }
+
+  public void setFilePath(String filePath) {
+    this.filePath = filePath;
+  }
+
+  public String getFileName() {
+    return fileName;
+  }
+
+  public void setFileName(String fileName) {
+    this.fileName = fileName;
+  }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/UploadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java
similarity index 91%
rename from Aria/src/main/java/com/arialyy/aria/core/UploadReceiver.java
rename to Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java
index 51eff28d..aa012d22 100644
--- a/Aria/src/main/java/com/arialyy/aria/core/UploadReceiver.java
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java
@@ -13,7 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.arialyy.aria.core;
+package com.arialyy.aria.core.upload;
+
+import com.arialyy.aria.core.inf.IReceiver;
 
 /**
  * Created by Aria.Lao on 2017/2/6.
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTaskEntity.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTaskEntity.java
new file mode 100644
index 00000000..c23cd2be
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTaskEntity.java
@@ -0,0 +1,22 @@
+package com.arialyy.aria.core.upload;
+
+import com.arialyy.aria.core.RequestEnum;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by Aria.Lao on 2017/2/9.
+ */
+
+public class UploadTaskEntity {
+  public UploadEntity uploadEntity;
+  public RequestEnum requestEnum = RequestEnum.GET;
+  public String uploadUrl; //上传路径
+  public String uploadKey;  //文件上传需要的key
+  public String contentType = "multipart/form-data"; //上传的文件类型
+  public Map headers = new HashMap<>();
+
+  public UploadTaskEntity(UploadEntity downloadEntity) {
+    this.uploadEntity = downloadEntity;
+  }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadUtil.java
new file mode 100644
index 00000000..2a3b1020
--- /dev/null
+++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadUtil.java
@@ -0,0 +1,122 @@
+package com.arialyy.aria.core.upload;
+
+import android.util.Log;
+import com.arialyy.aria.util.CheckUtil;
+import java.io.BufferedInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+/**
+ * Created by Aria.Lao on 2017/2/9.
+ * 上传工具
+ */
+public class UploadUtil implements Runnable {
+  private static final String TAG = "UploadUtil";
+  private UploadEntity mUploadEntity;
+  private UploadTaskEntity mTaskEntity;
+  private IUploadListener mListener;
+
+
+  public UploadUtil(UploadTaskEntity taskEntity, IUploadListener listener) {
+    mTaskEntity = taskEntity;
+    CheckUtil.checkUploadEntity(taskEntity.uploadEntity);
+    mUploadEntity = taskEntity.uploadEntity;
+    mListener = listener;
+  }
+
+  public void start() {
+    new Thread(this).start();
+  }
+
+  @Override public void run() {
+    File file = new File(mUploadEntity.getFilePath());
+    if (!file.exists()) {
+      Log.e(TAG, "【" + mUploadEntity.getFilePath() + "】,文件不存在。");
+      mListener.onFail();
+      return;
+    }
+    String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成
+    String PREFIX = "--", LINE_END = "\r\n";
+    String CONTENT_TYPE = "multipart/form-data"; // 内容类型
+    try {
+      HttpURLConnection conn = (HttpURLConnection) new URL(mTaskEntity.uploadUrl).openConnection();
+      conn.setReadTimeout(5000);
+      conn.setConnectTimeout(5000);
+      conn.setDoInput(true);
+      conn.setDoOutput(true);
+      conn.setUseCaches(false);
+      conn.setRequestMethod("POST");
+      conn.setRequestProperty("Charset", "utf-8"); // 设置编码
+      conn.setRequestProperty("connection", "keep-alive");
+      //conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
+      conn.setRequestProperty("Content-Type", mTaskEntity.contentType + ";boundary=" + BOUNDARY);
+
+      Set keys = mTaskEntity.headers.keySet();
+      for (String key : keys) {
+        conn.setRequestProperty(key, mTaskEntity.headers.get(key));
+      }
+
+      OutputStream outputSteam = conn.getOutputStream();
+      DataOutputStream dos = new DataOutputStream(outputSteam);
+      StringBuilder sb = new StringBuilder();
+      sb.append(PREFIX);
+      sb.append(BOUNDARY);
+      sb.append(LINE_END);
+      sb.append("Content-Disposition: form-data; name=\"")
+          .append(mTaskEntity.uploadUrl)
+          .append("\"; filename=\"")
+          .append(file.getName())
+          .append("\"")
+          .append(LINE_END);
+      sb.append("Content-Type:")
+          .append(mTaskEntity.contentType)
+          .append("; charset=utf-8")
+          .append(LINE_END);
+      sb.append(LINE_END);
+      dos.write(sb.toString().getBytes());
+
+      InputStream is = new FileInputStream(file);
+      byte[] bytes = new byte[1024];
+      int len = 0;
+      while ((len = is.read(bytes)) != -1) {
+        dos.write(bytes, 0, len);
+      }
+      is.close();
+      dos.write(LINE_END.getBytes());
+      byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
+      dos.write(end_data);
+      dos.flush();
+      dos.close();
+
+      int res = conn.getResponseCode();
+      if (res == 200) {
+        BufferedInputStream inputStream = new BufferedInputStream(conn.getInputStream());
+        byte[] buf = new byte[1024];
+        StringBuilder stringBuilder = new StringBuilder();
+        while (inputStream.read(buf) > 0) {
+          stringBuilder.append(new String(buf, 0, buf.length));
+        }
+        String data = stringBuilder.toString();
+        Log.d(TAG, data);
+        //L.j(data);
+        //absResponse.onResponse(data);
+      } else {
+        //absResponse.onError("error");
+      }
+    } catch (MalformedURLException e) {
+      e.printStackTrace();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java
index 16ba16ba..08d56d48 100644
--- a/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java
+++ b/Aria/src/main/java/com/arialyy/aria/util/CheckUtil.java
@@ -18,7 +18,8 @@ package com.arialyy.aria.util;
 
 import android.text.TextUtils;
 import android.util.Log;
-import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.upload.UploadEntity;
 import com.arialyy.aria.exception.FileException;
 import java.io.File;
 import java.util.regex.Matcher;
@@ -73,21 +74,32 @@ public class CheckUtil {
     if (TextUtils.isEmpty(downloadUrl)) throw new IllegalArgumentException("下载链接不能为null");
   }
 
+  /**
+   * 检查上传实体是否合法
+   */
+  public static void checkUploadEntity(UploadEntity entity) {
+    if (entity == null) {
+      throw new NullPointerException("上传实体不能为空");
+    }
+    if (TextUtils.isEmpty(entity.getFilePath())) {
+      throw new IllegalArgumentException("上传文件路径不能为空");
+    } else if (TextUtils.isEmpty(entity.getFileName())) {
+      throw new IllegalArgumentException("上传文件名不能为空");
+    }
+  }
+
   /**
    * 检测下载实体是否合法
    *
    * @param entity 下载实体
    * @return 合法(true)
    */
-  public static boolean checkDownloadEntity(DownloadEntity entity) {
+  public static void checkDownloadEntity(DownloadEntity entity) {
     if (entity == null) {
-      Log.w(TAG, "下载实体不能为空");
-      return false;
+      throw new NullPointerException("下载实体不能为空");
     } else if (TextUtils.isEmpty(entity.getDownloadUrl())) {
-      Log.w(TAG, "下载链接不能为空");
-      return false;
+      throw new IllegalArgumentException("下载链接不能为空");
     } else if (TextUtils.isEmpty(entity.getFileName())) {
-      //Log.w(TAG, "文件名不能为空");
       throw new FileException("文件名不能为null");
     } else if (TextUtils.isEmpty(entity.getDownloadPath())) {
       throw new FileException("文件保存路径不能为null");
@@ -102,6 +114,5 @@ public class CheckUtil {
       dPath += fileName;
       entity.setDownloadPath(dPath);
     }
-    return true;
   }
 }
\ No newline at end of file
diff --git a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java
index e640883e..43ece013 100644
--- a/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java
+++ b/Aria/src/main/java/com/arialyy/aria/util/CommonUtil.java
@@ -21,10 +21,9 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.net.Uri;
 import android.util.Log;
-import com.arialyy.aria.core.DownloadTaskEntity;
-import com.arialyy.aria.core.command.download.CmdFactory;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.command.download.IDownloadCmd;
+import com.arialyy.aria.core.download.DownloadTaskEntity;
+import com.arialyy.aria.core.download.command.CmdFactory;
+import com.arialyy.aria.core.download.command.IDownloadCmd;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 681656f0..5aacf3df 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,8 +14,9 @@
       android:supportsRtl="true"
       android:theme="@style/AppTheme.NoActionBar">
     
+        
     
       
         
diff --git a/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java b/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java
index 6f3ac0d5..76788d97 100644
--- a/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java
+++ b/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java
@@ -7,10 +7,10 @@ import android.widget.Button;
 import android.widget.TextView;
 import butterknife.Bind;
 import butterknife.OnClick;
-import com.arialyy.aria.core.DownloadTarget;
+import com.arialyy.aria.core.download.DownloadTarget;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.aria.util.CommonUtil;
 import com.arialyy.frame.core.AbsDialog;
 import com.arialyy.simple.R;
@@ -86,26 +86,26 @@ public class DownloadDialog extends AbsDialog {
 
   private class MyDialogDownloadCallback extends Aria.SimpleSchedulerListener {
 
-    @Override public void onTaskPre(Task task) {
+    @Override public void onTaskPre(DownloadTask task) {
       super.onTaskPre(task);
       mSize.setText(CommonUtil.formatFileSize(task.getFileSize()));
       setBtState(false);
     }
 
-    @Override public void onTaskStop(Task task) {
+    @Override public void onTaskStop(DownloadTask task) {
       super.onTaskStop(task);
       setBtState(true);
       mSpeed.setText("0.0kb/s");
     }
 
-    @Override public void onTaskCancel(Task task) {
+    @Override public void onTaskCancel(DownloadTask task) {
       super.onTaskCancel(task);
       setBtState(true);
       mPb.setProgress(0);
       mSpeed.setText("0.0kb/s");
     }
 
-    @Override public void onTaskRunning(Task task) {
+    @Override public void onTaskRunning(DownloadTask task) {
       super.onTaskRunning(task);
       long current = task.getCurrentProgress();
       long len     = task.getFileSize();
diff --git a/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java b/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java
index a97e03a0..7f2ac88f 100644
--- a/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java
+++ b/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java
@@ -7,10 +7,10 @@ import android.widget.Button;
 import android.widget.TextView;
 import butterknife.Bind;
 import butterknife.OnClick;
-import com.arialyy.aria.core.DownloadTarget;
+import com.arialyy.aria.core.download.DownloadTarget;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.aria.util.CommonUtil;
 import com.arialyy.frame.core.AbsFragment;
 import com.arialyy.simple.R;
@@ -90,26 +90,26 @@ public class DownloadFragment extends AbsFragment {
 
   private class MyDialogDownloadCallback extends Aria.SimpleSchedulerListener {
 
-    @Override public void onTaskPre(Task task) {
+    @Override public void onTaskPre(DownloadTask task) {
       super.onTaskPre(task);
       mSize.setText(CommonUtil.formatFileSize(task.getFileSize()));
       setBtState(false);
     }
 
-    @Override public void onTaskStop(Task task) {
+    @Override public void onTaskStop(DownloadTask task) {
       super.onTaskStop(task);
       setBtState(true);
       mSpeed.setText("0.0kb/s");
     }
 
-    @Override public void onTaskCancel(Task task) {
+    @Override public void onTaskCancel(DownloadTask task) {
       super.onTaskCancel(task);
       setBtState(true);
       mPb.setProgress(0);
       mSpeed.setText("0.0kb/s");
     }
 
-    @Override public void onTaskRunning(Task task) {
+    @Override public void onTaskRunning(DownloadTask task) {
       super.onTaskRunning(task);
       long current = task.getCurrentProgress();
       long len     = task.getFileSize();
diff --git a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java
index fad25862..4a084193 100644
--- a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java
+++ b/app/src/main/java/com/arialyy/simple/module/DownloadModule.java
@@ -23,7 +23,7 @@ import android.content.IntentFilter;
 import android.os.Environment;
 import android.os.Handler;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadEntity;
 import com.arialyy.aria.util.CommonUtil;
 import com.arialyy.frame.util.AndroidUtils;
 import com.arialyy.frame.util.StringUtil;
diff --git a/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java b/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java
index 30b98b98..69fb7ba9 100644
--- a/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java
+++ b/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java
@@ -5,7 +5,7 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import butterknife.Bind;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.frame.util.show.L;
 import com.arialyy.simple.R;
 import com.arialyy.simple.base.BaseActivity;
@@ -40,45 +40,45 @@ public class DownloadActivity extends BaseActivity {
   }
 
   private class MySchedulerListener extends Aria.SimpleSchedulerListener {
-    @Override public void onTaskPre(Task task) {
+    @Override public void onTaskPre(DownloadTask task) {
       super.onTaskPre(task);
       L.d(TAG, "download pre");
       mAdapter.updateState(task.getDownloadEntity());
     }
 
-    @Override public void onTaskStart(Task task) {
+    @Override public void onTaskStart(DownloadTask task) {
       super.onTaskStart(task);
       L.d(TAG, "download start");
       mAdapter.updateState(task.getDownloadEntity());
     }
 
-    @Override public void onTaskResume(Task task) {
+    @Override public void onTaskResume(DownloadTask task) {
       super.onTaskResume(task);
       L.d(TAG, "download resume");
       mAdapter.updateState(task.getDownloadEntity());
     }
 
-    @Override public void onTaskRunning(Task task) {
+    @Override public void onTaskRunning(DownloadTask task) {
       super.onTaskRunning(task);
       mAdapter.setProgress(task.getDownloadEntity());
     }
 
-    @Override public void onTaskStop(Task task) {
+    @Override public void onTaskStop(DownloadTask task) {
       super.onTaskStop(task);
       mAdapter.updateState(task.getDownloadEntity());
     }
 
-    @Override public void onTaskCancel(Task task) {
+    @Override public void onTaskCancel(DownloadTask task) {
       super.onTaskCancel(task);
       mAdapter.updateState(task.getDownloadEntity());
     }
 
-    @Override public void onTaskComplete(Task task) {
+    @Override public void onTaskComplete(DownloadTask task) {
       super.onTaskComplete(task);
       mAdapter.updateState(task.getDownloadEntity());
     }
 
-    @Override public void onTaskFail(Task task) {
+    @Override public void onTaskFail(DownloadTask task) {
       super.onTaskFail(task);
       L.d(TAG, "download fail");
     }
diff --git a/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java b/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java
index 75494f48..49518df7 100644
--- a/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java
+++ b/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java
@@ -25,7 +25,7 @@ import butterknife.Bind;
 import com.arialyy.absadapter.common.AbsHolder;
 import com.arialyy.absadapter.recycler_view.AbsRVAdapter;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.DownloadEntity;
+import com.arialyy.aria.core.download.DownloadEntity;
 import com.arialyy.aria.util.CommonUtil;
 import com.arialyy.simple.R;
 import com.arialyy.simple.widget.HorizontalProgressBarWithNumber;
diff --git a/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java b/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java
index 4b7f6aae..fcad3a1b 100644
--- a/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java
+++ b/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java
@@ -24,7 +24,7 @@ import android.support.v7.widget.Toolbar;
 import android.view.View;
 import butterknife.Bind;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.simple.R;
 import com.arialyy.simple.base.BaseActivity;
 import com.arialyy.simple.databinding.ActivityMultiBinding;
@@ -89,26 +89,26 @@ public class MultiTaskActivity extends BaseActivity {
 
   private class DownloadListener extends Aria.SimpleSchedulerListener {
 
-    @Override public void onTaskStart(Task task) {
+    @Override public void onTaskStart(DownloadTask task) {
       super.onTaskStart(task);
       mAdapter.updateBtState(task.getDownloadUrl(), false);
     }
 
-    @Override public void onTaskRunning(Task task) {
+    @Override public void onTaskRunning(DownloadTask task) {
       super.onTaskRunning(task);
     }
 
-    @Override public void onTaskResume(Task task) {
+    @Override public void onTaskResume(DownloadTask task) {
       super.onTaskResume(task);
       mAdapter.updateBtState(task.getDownloadUrl(), false);
     }
 
-    @Override public void onTaskStop(Task task) {
+    @Override public void onTaskStop(DownloadTask task) {
       super.onTaskStop(task);
       mAdapter.updateBtState(task.getDownloadUrl(), true);
     }
 
-    @Override public void onTaskComplete(Task task) {
+    @Override public void onTaskComplete(DownloadTask task) {
       super.onTaskComplete(task);
       mAdapter.updateBtState(task.getDownloadUrl(), true);
     }
diff --git a/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java b/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java
index b71ca512..248fcfca 100644
--- a/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java
+++ b/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java
@@ -5,7 +5,7 @@ import android.content.Context;
 import android.os.Environment;
 import android.support.v4.app.NotificationCompat;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.simple.R;
 
 /**
@@ -59,19 +59,19 @@ public class SimpleNotification {
       mManager = manager;
     }
 
-    @Override public void onTaskStart(Task task) {
+    @Override public void onTaskStart(DownloadTask task) {
       super.onTaskStart(task);
     }
 
-    @Override public void onTaskPre(Task task) {
+    @Override public void onTaskPre(DownloadTask task) {
       super.onTaskPre(task);
     }
 
-    @Override public void onTaskStop(Task task) {
+    @Override public void onTaskStop(DownloadTask task) {
       super.onTaskStop(task);
     }
 
-    @Override public void onTaskRunning(Task task) {
+    @Override public void onTaskRunning(DownloadTask task) {
       super.onTaskRunning(task);
       long len = task.getFileSize();
       int p = (int) (task.getCurrentProgress() * 100 / len);
@@ -81,7 +81,7 @@ public class SimpleNotification {
       }
     }
 
-    @Override public void onTaskComplete(Task task) {
+    @Override public void onTaskComplete(DownloadTask task) {
       super.onTaskComplete(task);
       if (mBuilder != null) {
         mBuilder.setProgress(100, 100, false);
@@ -89,7 +89,7 @@ public class SimpleNotification {
       }
     }
 
-    @Override public void onTaskCancel(Task task) {
+    @Override public void onTaskCancel(DownloadTask task) {
       super.onTaskCancel(task);
     }
   }
diff --git a/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java b/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java
index 171c52ab..744a7748 100644
--- a/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java
+++ b/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java
@@ -9,10 +9,10 @@ import android.widget.Button;
 import android.widget.TextView;
 import butterknife.Bind;
 import butterknife.OnClick;
-import com.arialyy.aria.core.DownloadTarget;
+import com.arialyy.aria.core.download.DownloadTarget;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.aria.util.CommonUtil;
 import com.arialyy.frame.core.AbsPopupWindow;
 import com.arialyy.simple.R;
@@ -88,26 +88,26 @@ public class DownloadPopupWindow extends AbsPopupWindow {
 
   private class MyDialogDownloadCallback extends Aria.SimpleSchedulerListener {
 
-    @Override public void onTaskPre(Task task) {
+    @Override public void onTaskPre(DownloadTask task) {
       super.onTaskPre(task);
       mSize.setText(CommonUtil.formatFileSize(task.getFileSize()));
       setBtState(false);
     }
 
-    @Override public void onTaskStop(Task task) {
+    @Override public void onTaskStop(DownloadTask task) {
       super.onTaskStop(task);
       setBtState(true);
       mSpeed.setText("0.0kb/s");
     }
 
-    @Override public void onTaskCancel(Task task) {
+    @Override public void onTaskCancel(DownloadTask task) {
       super.onTaskCancel(task);
       setBtState(true);
       mPb.setProgress(0);
       mSpeed.setText("0.0kb/s");
     }
 
-    @Override public void onTaskRunning(Task task) {
+    @Override public void onTaskRunning(DownloadTask task) {
       super.onTaskRunning(task);
       long current = task.getCurrentProgress();
       long len     = task.getFileSize();
diff --git a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java
index b039d3a3..db9cb4bc 100644
--- a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java
+++ b/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java
@@ -30,10 +30,10 @@ import android.widget.ImageView;
 import android.widget.TextView;
 import android.widget.Toast;
 import butterknife.Bind;
-import com.arialyy.aria.core.DownloadTarget;
+import com.arialyy.aria.core.download.DownloadTarget;
 import com.arialyy.aria.core.Aria;
-import com.arialyy.aria.core.DownloadEntity;
-import com.arialyy.aria.core.task.Task;
+import com.arialyy.aria.core.download.DownloadEntity;
+import com.arialyy.aria.core.download.task.DownloadTask;
 import com.arialyy.aria.util.CommonUtil;
 import com.arialyy.frame.util.show.L;
 import com.arialyy.simple.R;
@@ -76,7 +76,7 @@ public class SingleTaskActivity extends BaseActivity {
       super.handleMessage(msg);
       switch (msg.what) {
         case DOWNLOAD_RUNNING:
-          Task task = (Task) msg.obj;
+          DownloadTask task = (DownloadTask) msg.obj;
           long current = task.getCurrentProgress();
           long len = task.getFileSize();
           if (len == 0) {
@@ -208,33 +208,33 @@ public class SingleTaskActivity extends BaseActivity {
   }
 
   private class MySchedulerListener extends Aria.SimpleSchedulerListener {
-    @Override public void onTaskStart(Task task) {
+    @Override public void onTaskStart(DownloadTask task) {
       mUpdateHandler.obtainMessage(DOWNLOAD_PRE, task.getDownloadEntity().getFileSize())
           .sendToTarget();
     }
 
-    @Override public void onTaskResume(Task task) {
+    @Override public void onTaskResume(DownloadTask task) {
       super.onTaskResume(task);
       mUpdateHandler.obtainMessage(DOWNLOAD_PRE, task.getFileSize()).sendToTarget();
     }
 
-    @Override public void onTaskStop(Task task) {
+    @Override public void onTaskStop(DownloadTask task) {
       mUpdateHandler.sendEmptyMessage(DOWNLOAD_STOP);
     }
 
-    @Override public void onTaskCancel(Task task) {
+    @Override public void onTaskCancel(DownloadTask task) {
       mUpdateHandler.sendEmptyMessage(DOWNLOAD_CANCEL);
     }
 
-    @Override public void onTaskFail(Task task) {
+    @Override public void onTaskFail(DownloadTask task) {
       mUpdateHandler.sendEmptyMessage(DOWNLOAD_FAILE);
     }
 
-    @Override public void onTaskComplete(Task task) {
+    @Override public void onTaskComplete(DownloadTask task) {
       mUpdateHandler.sendEmptyMessage(DOWNLOAD_COMPLETE);
     }
 
-    @Override public void onTaskRunning(Task task) {
+    @Override public void onTaskRunning(DownloadTask task) {
       mUpdateHandler.obtainMessage(DOWNLOAD_RUNNING, task).sendToTarget();
     }
   }
diff --git a/app/src/main/java/com/arialyy/simple/upload.java b/app/src/main/java/com/arialyy/simple/upload.java
new file mode 100644
index 00000000..b88fa5a6
--- /dev/null
+++ b/app/src/main/java/com/arialyy/simple/upload.java
@@ -0,0 +1,36 @@
+package com.arialyy.simple;
+
+import android.view.View;
+import com.arialyy.aria.core.upload.IUploadListener;
+import com.arialyy.aria.core.upload.UploadEntity;
+import com.arialyy.aria.core.upload.UploadTaskEntity;
+import com.arialyy.aria.core.upload.UploadUtil;
+import com.arialyy.simple.base.BaseActivity;
+import com.arialyy.simple.databinding.ActivityUploadBinding;
+
+/**
+ * Created by Aria.Lao on 2017/2/9.
+ */
+
+public class upload extends BaseActivity{
+  @Override protected int setLayoutId() {
+    return R.layout.activity_upload;
+
+  }
+
+  public void onClick(View view){
+    UploadEntity entity = new UploadEntity();
+    entity.setFilePath("/sdcard/Download/test.pdf");
+    entity.setFileName("test.pdf");
+    UploadTaskEntity taskEntity = new UploadTaskEntity(entity);
+    taskEntity.uploadUrl = "http://172.21.1.160:8080/upload";
+    taskEntity.uploadKey = "file";
+    UploadUtil util = new UploadUtil(taskEntity, new IUploadListener() {
+      @Override public void onFail() {
+
+      }
+    });
+    util.start();
+  }
+
+}
diff --git a/app/src/main/res/layout/activity_upload.xml b/app/src/main/res/layout/activity_upload.xml
new file mode 100644
index 00000000..9782fff3
--- /dev/null
+++ b/app/src/main/res/layout/activity_upload.xml
@@ -0,0 +1,22 @@
+
+
+
+  
+    
+
+    
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 db0e4cd4..2bfd5868 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java +++ b/Aria/src/main/java/com/arialyy/aria/core/AriaManager.java @@ -124,7 +124,7 @@ import java.util.Map; UploadReceiver upload(Object obj) { IReceiver receiver = mReceivers.get(getKey(false, obj)); if (receiver == null) { - receiver = putReceiver(true, obj); + receiver = putReceiver(false, obj); } return (receiver instanceof UploadReceiver) ? (UploadReceiver) receiver : null; } diff --git a/Aria/src/main/java/com/arialyy/aria/core/queue/pool/ExecutePool.java b/Aria/src/main/java/com/arialyy/aria/core/queue/pool/ExecutePool.java index 6b9b573d..9cfed938 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/queue/pool/ExecutePool.java +++ b/Aria/src/main/java/com/arialyy/aria/core/queue/pool/ExecutePool.java @@ -47,12 +47,12 @@ public class ExecutePool implements IPool { @Override public boolean putTask(TASK task) { synchronized (LOCK) { if (task == null) { - Log.e(TAG, "下载任务不能为空!!"); + Log.e(TAG, "任务不能为空!!"); return false; } String url = task.getKey(); if (mExecuteQueue.contains(task)) { - Log.e(TAG, "队列中已经包含了该任务,任务下载链接【" + url + "】"); + Log.e(TAG, "队列中已经包含了该任务,任务key【" + url + "】"); return false; } else { if (mExecuteQueue.size() >= mSize) { @@ -144,7 +144,7 @@ public class ExecutePool implements IPool { @Override public TASK getTask(String downloadUrl) { synchronized (LOCK) { if (TextUtils.isEmpty(downloadUrl)) { - Log.e(TAG, "请传入有效的下载链接"); + Log.e(TAG, "请传入有效的任务key"); return null; } String key = CommonUtil.keyToHashKey(downloadUrl); @@ -168,7 +168,7 @@ public class ExecutePool implements IPool { @Override public boolean removeTask(String downloadUrl) { synchronized (LOCK) { if (TextUtils.isEmpty(downloadUrl)) { - Log.e(TAG, "请传入有效的下载链接"); + Log.e(TAG, "请传入有效的任务key"); return false; } String key = CommonUtil.keyToHashKey(downloadUrl); diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java index 4ebee3c7..80b70cfa 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadReceiver.java @@ -16,6 +16,7 @@ package com.arialyy.aria.core.upload; import android.support.annotation.NonNull; +import android.util.Log; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.command.AbsCmd; import com.arialyy.aria.core.command.CmdFactory; @@ -29,6 +30,8 @@ import com.arialyy.aria.util.CommonUtil; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Created by Aria.Lao on 2017/2/6. @@ -50,6 +53,11 @@ public class UploadReceiver implements IReceiver { if (entity == null) { entity = new UploadEntity(); } + String regex = "[/|\\\\|//]"; + Pattern p = Pattern.compile(regex); + String[] strs = p.split(filePath); + String fileName = strs[strs.length - 1]; + entity.setFileName(fileName); entity.setFilePath(filePath); return new UploadTarget(entity, targetName); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java index 5b79b1ed..9c084a2a 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadTask.java @@ -41,11 +41,11 @@ public class UploadTask implements ITask { } @Override public String getKey() { - return null; + return mUploadEntity.getFilePath(); } @Override public boolean isRunning() { - return false; + return mUtil.isRunning(); } public UploadEntity getUploadEntity() { @@ -197,7 +197,7 @@ public class UploadTask implements ITask { */ private void sendInState2Target(int state) { if (outHandler.get() != null) { - outHandler.get().obtainMessage(state, task).sendToTarget(); + outHandler.get().obtainMessage(state, task.get()).sendToTarget(); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadUtil.java index 12e5a702..916ed0f3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadUtil.java @@ -1,3 +1,18 @@ +/* + * 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.upload; import android.util.Log; @@ -21,7 +36,7 @@ import java.util.UUID; * Created by Aria.Lao on 2017/2/9. * 上传工具 */ -public class UploadUtil implements Runnable { +final class UploadUtil implements Runnable { private static final String TAG = "UploadUtil"; private final String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成 private final String PREFIX = "--", LINE_END = "\r\n"; @@ -35,7 +50,7 @@ public class UploadUtil implements Runnable { private boolean isCancel = false; private boolean isRunning = false; - public UploadUtil(UploadTaskEntity taskEntity, IUploadListener listener) { + UploadUtil(UploadTaskEntity taskEntity, IUploadListener listener) { mTaskEntity = taskEntity; CheckUtil.checkUploadEntity(taskEntity.uploadEntity); mUploadEntity = taskEntity.uploadEntity; @@ -51,7 +66,7 @@ public class UploadUtil implements Runnable { new Thread(this).start(); } - public void cancel(){ + public void cancel() { isCancel = true; isRunning = false; } @@ -96,16 +111,13 @@ public class UploadUtil implements Runnable { mListener.onStart(uploadFile.length()); addFilePart(mTaskEntity.attachment, uploadFile); Log.d(TAG, finish() + ""); - } catch (MalformedURLException e) { - e.printStackTrace(); - fail(); } catch (IOException e) { e.printStackTrace(); fail(); } } - public boolean isRunning() { + boolean isRunning() { return isRunning; } @@ -200,8 +212,6 @@ public class UploadUtil implements Runnable { } reader.close(); mHttpConn.disconnect(); - } else { - throw new IOException("Server returned non-OK status: " + status); } mWriter.flush(); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5aacf3df..edc9d707 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,10 +13,8 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme.NoActionBar"> - - @@ -25,10 +23,11 @@ - - - - + + + + + diff --git a/app/src/main/java/com/arialyy/simple/MainActivity.java b/app/src/main/java/com/arialyy/simple/MainActivity.java index 0df80bbc..d56a452b 100644 --- a/app/src/main/java/com/arialyy/simple/MainActivity.java +++ b/app/src/main/java/com/arialyy/simple/MainActivity.java @@ -1,114 +1,37 @@ -/* - * 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.simple; -import android.Manifest; import android.content.Intent; -import android.os.Build; import android.os.Bundle; import android.support.v7.widget.Toolbar; -import android.view.Gravity; import android.view.View; -import android.widget.Button; import butterknife.Bind; -import com.arialyy.frame.permission.OnPermissionCallback; -import com.arialyy.frame.permission.PermissionManager; -import com.arialyy.frame.util.show.T; +import butterknife.OnClick; import com.arialyy.simple.base.BaseActivity; import com.arialyy.simple.databinding.ActivityMainBinding; -import com.arialyy.simple.dialog_task.DownloadDialog; -import com.arialyy.simple.fragment_task.FragmentActivity; -import com.arialyy.simple.multi_task.MultiTaskActivity; -import com.arialyy.simple.notification.SimpleNotification; -import com.arialyy.simple.pop_task.DownloadPopupWindow; -import com.arialyy.simple.single_task.SingleTaskActivity; +import com.arialyy.simple.download.DownloadActivity; +import com.arialyy.simple.upload.UploadActivity; /** - * Created by Lyy on 2016/10/13. + * Created by Aria.Lao on 2017/3/1. */ public class MainActivity extends BaseActivity { + @Bind(R.id.toolbar) Toolbar mBar; - @Bind(R.id.single_task) Button mSigleBt; - @Bind(R.id.multi_task) Button mMultiBt; - @Bind(R.id.dialog_task) Button mDialogBt; - @Bind(R.id.pop_task) Button mPopBt; + + @Override protected void init(Bundle savedInstanceState) { + super.init(savedInstanceState); + mBar.setTitle("Aria Demo"); + } @Override protected int setLayoutId() { return R.layout.activity_main; } - @Override protected void init(Bundle savedInstanceState) { - super.init(savedInstanceState); - setSupportActionBar(mBar); - mBar.setTitle("多线程多任务下载"); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - setEnable(true); - } else { //6.0处理 - boolean hasPermission = PermissionManager.getInstance() - .checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); - if (hasPermission) { - setEnable(true); - } else { - setEnable(false); - PermissionManager.getInstance().requestPermission(this, new OnPermissionCallback() { - @Override public void onSuccess(String... permissions) { - setEnable(true); - } - - @Override public void onFail(String... permissions) { - T.showShort(MainActivity.this, "没有文件读写权限"); - setEnable(false); - } - }, Manifest.permission.WRITE_EXTERNAL_STORAGE); - } - } + @OnClick(R.id.download) public void downloadDemo() { + startActivity(new Intent(this, DownloadActivity.class)); } - private void setEnable(boolean enable) { - mSigleBt.setEnabled(enable); - mMultiBt.setEnabled(enable); - mDialogBt.setEnabled(enable); - mPopBt.setEnabled(enable); + @OnClick(R.id.upload) public void uploadDemo() { + startActivity(new Intent(this, UploadActivity.class)); } - - public void onClick(View view) { - switch (view.getId()) { - case R.id.single_task: - startActivity(new Intent(this, SingleTaskActivity.class)); - break; - case R.id.multi_task: - startActivity(new Intent(this, MultiTaskActivity.class)); - break; - case R.id.dialog_task: - DownloadDialog dialog = new DownloadDialog(this); - dialog.show(); - break; - case R.id.pop_task: - DownloadPopupWindow pop = new DownloadPopupWindow(this); - //pop.showAsDropDown(mRootView); - pop.showAtLocation(mRootView, Gravity.CENTER_VERTICAL, 0, 0); - break; - case R.id.fragment_task: - startActivity(new Intent(this, FragmentActivity.class)); - break; - case R.id.notification: - SimpleNotification notification = new SimpleNotification(this); - notification.start(); - break; - } - } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/arialyy/simple/download/DownloadActivity.java b/app/src/main/java/com/arialyy/simple/download/DownloadActivity.java new file mode 100644 index 00000000..eec0ce78 --- /dev/null +++ b/app/src/main/java/com/arialyy/simple/download/DownloadActivity.java @@ -0,0 +1,111 @@ +/* + * 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.simple.download; + +import android.Manifest; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.view.Gravity; +import android.view.View; +import android.widget.Button; +import butterknife.Bind; +import com.arialyy.frame.permission.OnPermissionCallback; +import com.arialyy.frame.permission.PermissionManager; +import com.arialyy.frame.util.show.T; +import com.arialyy.simple.R; +import com.arialyy.simple.base.BaseActivity; +import com.arialyy.simple.databinding.ActivityDownloadMeanBinding; +import com.arialyy.simple.download.fragment_download.FragmentActivity; +import com.arialyy.simple.download.multi_download.MultiTaskActivity; + +/** + * Created by Lyy on 2016/10/13. + */ +public class DownloadActivity extends BaseActivity { + @Bind(R.id.toolbar) Toolbar mBar; + @Bind(R.id.single_task) Button mSigleBt; + @Bind(R.id.multi_task) Button mMultiBt; + @Bind(R.id.dialog_task) Button mDialogBt; + @Bind(R.id.pop_task) Button mPopBt; + + @Override protected int setLayoutId() { + return R.layout.activity_download_mean; + } + + @Override protected void init(Bundle savedInstanceState) { + super.init(savedInstanceState); + setSupportActionBar(mBar); + mBar.setTitle("多线程多任务下载"); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + setEnable(true); + } else { //6.0处理 + boolean hasPermission = PermissionManager.getInstance() + .checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); + if (hasPermission) { + setEnable(true); + } else { + setEnable(false); + PermissionManager.getInstance().requestPermission(this, new OnPermissionCallback() { + @Override public void onSuccess(String... permissions) { + setEnable(true); + } + + @Override public void onFail(String... permissions) { + T.showShort(DownloadActivity.this, "没有文件读写权限"); + setEnable(false); + } + }, Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + } + } + + private void setEnable(boolean enable) { + mSigleBt.setEnabled(enable); + mMultiBt.setEnabled(enable); + mDialogBt.setEnabled(enable); + mPopBt.setEnabled(enable); + } + + public void onClick(View view) { + switch (view.getId()) { + case R.id.single_task: + startActivity(new Intent(this, SingleTaskActivity.class)); + break; + case R.id.multi_task: + startActivity(new Intent(this, MultiTaskActivity.class)); + break; + case R.id.dialog_task: + DownloadDialog dialog = new DownloadDialog(this); + dialog.show(); + break; + case R.id.pop_task: + DownloadPopupWindow pop = new DownloadPopupWindow(this); + //pop.showAsDropDown(mRootView); + pop.showAtLocation(mRootView, Gravity.CENTER_VERTICAL, 0, 0); + break; + case R.id.fragment_task: + startActivity(new Intent(this, FragmentActivity.class)); + break; + case R.id.notification: + SimpleNotification notification = new SimpleNotification(this); + notification.start(); + break; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java b/app/src/main/java/com/arialyy/simple/download/DownloadDialog.java similarity index 98% rename from app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java rename to app/src/main/java/com/arialyy/simple/download/DownloadDialog.java index f1092a96..62a7e593 100644 --- a/app/src/main/java/com/arialyy/simple/dialog_task/DownloadDialog.java +++ b/app/src/main/java/com/arialyy/simple/download/DownloadDialog.java @@ -1,4 +1,4 @@ -package com.arialyy.simple.dialog_task; +package com.arialyy.simple.download; import android.content.Context; import android.os.Environment; diff --git a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java b/app/src/main/java/com/arialyy/simple/download/DownloadModule.java similarity index 98% rename from app/src/main/java/com/arialyy/simple/module/DownloadModule.java rename to app/src/main/java/com/arialyy/simple/download/DownloadModule.java index 4a084193..a4303708 100644 --- a/app/src/main/java/com/arialyy/simple/module/DownloadModule.java +++ b/app/src/main/java/com/arialyy/simple/download/DownloadModule.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.arialyy.simple.module; +package com.arialyy.simple.download; import android.content.BroadcastReceiver; import android.content.Context; @@ -29,8 +29,7 @@ import com.arialyy.frame.util.AndroidUtils; import com.arialyy.frame.util.StringUtil; import com.arialyy.frame.util.show.L; import com.arialyy.simple.R; -import com.arialyy.simple.multi_task.FileListEntity; -import com.arialyy.simple.single_task.SingleTaskActivity; +import com.arialyy.simple.download.multi_download.FileListEntity; import com.arialyy.simple.base.BaseModule; import java.io.File; import java.util.ArrayList; diff --git a/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java b/app/src/main/java/com/arialyy/simple/download/DownloadPopupWindow.java similarity index 99% rename from app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java rename to app/src/main/java/com/arialyy/simple/download/DownloadPopupWindow.java index 176ba3e0..c5631a4f 100644 --- a/app/src/main/java/com/arialyy/simple/pop_task/DownloadPopupWindow.java +++ b/app/src/main/java/com/arialyy/simple/download/DownloadPopupWindow.java @@ -1,4 +1,4 @@ -package com.arialyy.simple.pop_task; +package com.arialyy.simple.download; import android.content.Context; import android.graphics.Color; diff --git a/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java b/app/src/main/java/com/arialyy/simple/download/SimpleNotification.java similarity index 98% rename from app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java rename to app/src/main/java/com/arialyy/simple/download/SimpleNotification.java index e16d1d87..e4e6c605 100644 --- a/app/src/main/java/com/arialyy/simple/notification/SimpleNotification.java +++ b/app/src/main/java/com/arialyy/simple/download/SimpleNotification.java @@ -1,4 +1,4 @@ -package com.arialyy.simple.notification; +package com.arialyy.simple.download; import android.app.NotificationManager; import android.content.Context; diff --git a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java similarity index 99% rename from app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java rename to app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java index a398b82b..12941c7f 100644 --- a/app/src/main/java/com/arialyy/simple/single_task/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.arialyy.simple.single_task; +package com.arialyy.simple.download; import android.content.BroadcastReceiver; import android.content.Context; diff --git a/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java b/app/src/main/java/com/arialyy/simple/download/fragment_download/DownloadFragment.java similarity index 98% rename from app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java rename to app/src/main/java/com/arialyy/simple/download/fragment_download/DownloadFragment.java index edd7155a..d9599818 100644 --- a/app/src/main/java/com/arialyy/simple/fragment_task/DownloadFragment.java +++ b/app/src/main/java/com/arialyy/simple/download/fragment_download/DownloadFragment.java @@ -1,4 +1,4 @@ -package com.arialyy.simple.fragment_task; +package com.arialyy.simple.download.fragment_download; import android.os.Bundle; import android.os.Environment; diff --git a/app/src/main/java/com/arialyy/simple/fragment_task/FragmentActivity.java b/app/src/main/java/com/arialyy/simple/download/fragment_download/FragmentActivity.java similarity index 86% rename from app/src/main/java/com/arialyy/simple/fragment_task/FragmentActivity.java rename to app/src/main/java/com/arialyy/simple/download/fragment_download/FragmentActivity.java index ff7a30cd..385c5769 100644 --- a/app/src/main/java/com/arialyy/simple/fragment_task/FragmentActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/fragment_download/FragmentActivity.java @@ -1,4 +1,4 @@ -package com.arialyy.simple.fragment_task; +package com.arialyy.simple.download.fragment_download; import com.arialyy.simple.R; import com.arialyy.simple.base.BaseActivity; diff --git a/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java b/app/src/main/java/com/arialyy/simple/download/multi_download/DownloadAdapter.java similarity index 99% rename from app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java rename to app/src/main/java/com/arialyy/simple/download/multi_download/DownloadAdapter.java index 17a7d3be..50326e33 100644 --- a/app/src/main/java/com/arialyy/simple/multi_task/DownloadAdapter.java +++ b/app/src/main/java/com/arialyy/simple/download/multi_download/DownloadAdapter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.arialyy.simple.multi_task; +package com.arialyy.simple.download.multi_download; import android.content.Context; import android.content.res.Resources; diff --git a/app/src/main/java/com/arialyy/simple/multi_task/DownloadNumDialog.java b/app/src/main/java/com/arialyy/simple/download/multi_download/DownloadNumDialog.java similarity index 97% rename from app/src/main/java/com/arialyy/simple/multi_task/DownloadNumDialog.java rename to app/src/main/java/com/arialyy/simple/download/multi_download/DownloadNumDialog.java index 9f666f3e..c6170809 100644 --- a/app/src/main/java/com/arialyy/simple/multi_task/DownloadNumDialog.java +++ b/app/src/main/java/com/arialyy/simple/download/multi_download/DownloadNumDialog.java @@ -15,7 +15,7 @@ */ -package com.arialyy.simple.multi_task; +package com.arialyy.simple.download.multi_download; import android.annotation.SuppressLint; import android.os.Bundle; diff --git a/app/src/main/java/com/arialyy/simple/multi_task/FileListAdapter.java b/app/src/main/java/com/arialyy/simple/download/multi_download/FileListAdapter.java similarity index 98% rename from app/src/main/java/com/arialyy/simple/multi_task/FileListAdapter.java rename to app/src/main/java/com/arialyy/simple/download/multi_download/FileListAdapter.java index 65ebccf7..f2349390 100644 --- a/app/src/main/java/com/arialyy/simple/multi_task/FileListAdapter.java +++ b/app/src/main/java/com/arialyy/simple/download/multi_download/FileListAdapter.java @@ -1,4 +1,4 @@ -package com.arialyy.simple.multi_task; +package com.arialyy.simple.download.multi_download; import android.content.Context; import android.view.View; diff --git a/app/src/main/java/com/arialyy/simple/multi_task/FileListEntity.java b/app/src/main/java/com/arialyy/simple/download/multi_download/FileListEntity.java similarity index 70% rename from app/src/main/java/com/arialyy/simple/multi_task/FileListEntity.java rename to app/src/main/java/com/arialyy/simple/download/multi_download/FileListEntity.java index 15d584a8..0f356b11 100644 --- a/app/src/main/java/com/arialyy/simple/multi_task/FileListEntity.java +++ b/app/src/main/java/com/arialyy/simple/download/multi_download/FileListEntity.java @@ -1,4 +1,4 @@ -package com.arialyy.simple.multi_task; +package com.arialyy.simple.download.multi_download; /** * Created by AriaL on 2017/1/6. diff --git a/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java b/app/src/main/java/com/arialyy/simple/download/multi_download/MultiDownloadActivity.java similarity index 83% rename from app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java rename to app/src/main/java/com/arialyy/simple/download/multi_download/MultiDownloadActivity.java index 61d4836a..304f685a 100644 --- a/app/src/main/java/com/arialyy/simple/multi_task/DownloadActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/multi_download/MultiDownloadActivity.java @@ -1,26 +1,28 @@ -package com.arialyy.simple.multi_task; +package com.arialyy.simple.download.multi_download; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; import butterknife.Bind; import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.download.DownloadTask; import com.arialyy.frame.util.show.L; import com.arialyy.simple.R; import com.arialyy.simple.base.BaseActivity; -import com.arialyy.simple.databinding.ActivityDownloadBinding; +import com.arialyy.simple.databinding.ActivityMultiDownloadBinding; /** * Created by AriaL on 2017/1/6. */ -public class DownloadActivity extends BaseActivity { - @Bind(R.id.list) RecyclerView mList; - private DownloadAdapter mAdapter; +public class MultiDownloadActivity extends BaseActivity { + @Bind(R.id.list) RecyclerView mList; + @Bind(R.id.toolbar) Toolbar mBar; + private DownloadAdapter mAdapter; @Override protected int setLayoutId() { - return R.layout.activity_download; + return R.layout.activity_multi_download; } @Override protected void init(Bundle savedInstanceState) { @@ -28,6 +30,7 @@ public class DownloadActivity extends BaseActivity { mAdapter = new DownloadAdapter(this, Aria.download(this).getTaskList()); mList.setLayoutManager(new LinearLayoutManager(this)); mList.setAdapter(mAdapter); + mBar.setTitle("多任务下载"); } @Override protected void dataCallback(int result, Object data) { diff --git a/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java b/app/src/main/java/com/arialyy/simple/download/multi_download/MultiTaskActivity.java similarity index 95% rename from app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java rename to app/src/main/java/com/arialyy/simple/download/multi_download/MultiTaskActivity.java index e8cb4af5..1817754a 100644 --- a/app/src/main/java/com/arialyy/simple/multi_task/MultiTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/multi_download/MultiTaskActivity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.arialyy.simple.multi_task; +package com.arialyy.simple.download.multi_download; import android.content.Intent; import android.os.Bundle; @@ -28,7 +28,7 @@ import com.arialyy.aria.core.download.DownloadTask; import com.arialyy.simple.R; import com.arialyy.simple.base.BaseActivity; import com.arialyy.simple.databinding.ActivityMultiBinding; -import com.arialyy.simple.module.DownloadModule; +import com.arialyy.simple.download.DownloadModule; import java.util.ArrayList; import java.util.List; @@ -65,7 +65,7 @@ public class MultiTaskActivity extends BaseActivity { Aria.download(this).stopAllTask(); break; case R.id.turn: - startActivity(new Intent(this, DownloadActivity.class)); + startActivity(new Intent(this, MultiDownloadActivity.class)); break; } } diff --git a/app/src/main/java/com/arialyy/simple/upload.java b/app/src/main/java/com/arialyy/simple/upload.java deleted file mode 100644 index bdf1a22d..00000000 --- a/app/src/main/java/com/arialyy/simple/upload.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.arialyy.simple; - -import android.view.View; -import android.widget.ProgressBar; -import butterknife.Bind; -import com.arialyy.aria.core.upload.IUploadListener; -import com.arialyy.aria.core.upload.UploadEntity; -import com.arialyy.aria.core.upload.UploadTaskEntity; -import com.arialyy.aria.core.upload.UploadUtil; -import com.arialyy.simple.base.BaseActivity; -import com.arialyy.simple.databinding.ActivityUploadBinding; -import com.arialyy.simple.widget.HorizontalProgressBarWithNumber; - -/** - * Created by Aria.Lao on 2017/2/9. - */ - -public class upload extends BaseActivity { - - @Bind(R.id.pb) HorizontalProgressBarWithNumber mPb; - - @Override protected int setLayoutId() { - return R.layout.activity_upload; - } - - public void onClick(View view) { - UploadEntity entity = new UploadEntity(); - entity.setFilePath("/sdcard/Download/test.zip"); - entity.setFileName("test.pdf"); - UploadTaskEntity taskEntity = new UploadTaskEntity(entity); - taskEntity.uploadUrl = "http://172.18.104.189:8080/upload/sign_file"; - taskEntity.attachment = "file"; - UploadUtil util = new UploadUtil(taskEntity, new IUploadListener() { - long fileSize = 0; - - @Override public void onPre() { - - } - - @Override public void onStart(long fileSize) { - this.fileSize = fileSize; - } - - @Override public void onResume(long resumeLocation) { - - } - - @Override public void onStop(long stopLocation) { - - } - - @Override public void onProgress(long currentLocation) { - int p = (int) (currentLocation * 100 / fileSize); - mPb.setProgress(p); - } - - @Override public void onCancel() { - - } - - @Override public void onComplete() { - - } - - @Override public void onFail() { - - } - }); - util.start(); - } -} diff --git a/app/src/main/java/com/arialyy/simple/upload/UploadActivity.java b/app/src/main/java/com/arialyy/simple/upload/UploadActivity.java new file mode 100644 index 00000000..82010b09 --- /dev/null +++ b/app/src/main/java/com/arialyy/simple/upload/UploadActivity.java @@ -0,0 +1,115 @@ +package com.arialyy.simple.upload; + +import android.os.Handler; +import android.os.Message; +import butterknife.Bind; +import butterknife.OnClick; +import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.upload.UploadTask; +import com.arialyy.frame.util.FileUtil; +import com.arialyy.frame.util.show.L; +import com.arialyy.frame.util.show.T; +import com.arialyy.simple.R; +import com.arialyy.simple.base.BaseActivity; +import com.arialyy.simple.databinding.ActivityUploadMeanBinding; +import com.arialyy.simple.widget.HorizontalProgressBarWithNumber; +import java.lang.ref.WeakReference; + +/** + * Created by Aria.Lao on 2017/2/9. + */ + +public class UploadActivity extends BaseActivity { + @Bind(R.id.pb) HorizontalProgressBarWithNumber mPb; + private static final int START = 0; + private static final int STOP = 1; + private static final int CANCEL = 2; + private static final int RUNNING = 3; + private static final int COMPLETE = 4; + + private static final String FILE_PATH = "/sdcard/Download/test.zip"; + + private Handler mHandler = new Handler() { + @Override public void handleMessage(Message msg) { + super.handleMessage(msg); + UploadTask task = (UploadTask) msg.obj; + switch (msg.what) { + case START: + getBinding().setFileSize(FileUtil.formatFileSize(task.getFileSize())); + break; + case STOP: + mPb.setProgress(0); + break; + case CANCEL: + mPb.setProgress(0); + break; + case RUNNING: + int p = (int) (task.getCurrentProgress() * 100 / task.getFileSize()); + L.d(TAG, "p ==> " + p); + mPb.setProgress(p); + break; + case COMPLETE: + T.showShort(UploadActivity.this, "上传完成"); + break; + } + } + }; + + @Override protected int setLayoutId() { + return R.layout.activity_upload_mean; + } + + @OnClick(R.id.upload) void upload() { + Aria.upload(this) + .load(FILE_PATH) + .setUploadUrl("http://172.18.104.50:8080/UploadActivity/sign_file") + .setAttachment("file") + .start(); + } + + @OnClick(R.id.stop) void stop() { + Aria.upload(this).load(FILE_PATH).stop(); + } + + @OnClick(R.id.remove) void remove() { + Aria.upload(this).load(FILE_PATH).cancel(); + } + + @Override protected void onResume() { + super.onResume(); + Aria.upload(this).addSchedulerListener(new UploadListener(mHandler)); + } + + static class UploadListener extends Aria.UploadSchedulerListener { + WeakReference handler; + + UploadListener(Handler handler) { + this.handler = new WeakReference<>(handler); + } + + @Override public void onTaskStart(UploadTask task) { + super.onTaskStart(task); + handler.get().obtainMessage(START, task).sendToTarget(); + } + + @Override public void onTaskStop(UploadTask task) { + super.onTaskStop(task); + handler.get().obtainMessage(STOP, task).sendToTarget(); + } + + @Override public void onTaskCancel(UploadTask task) { + super.onTaskCancel(task); + handler.get().obtainMessage(CANCEL, task).sendToTarget(); + } + + @Override public void onTaskRunning(UploadTask task) { + super.onTaskRunning(task); + handler.get().obtainMessage(RUNNING, task).sendToTarget(); + } + + @Override public void onTaskComplete(UploadTask task) { + super.onTaskComplete(task); + handler.get().obtainMessage(COMPLETE, task).sendToTarget(); + } + } +} diff --git a/app/src/main/res/layout/activity_download_mean.xml b/app/src/main/res/layout/activity_download_mean.xml new file mode 100644 index 00000000..08ccd012 --- /dev/null +++ b/app/src/main/res/layout/activity_download_mean.xml @@ -0,0 +1,69 @@ + + + + + + + +