From 374fdd12b907ce521b3e30e3354d81d01c2fa4e3 Mon Sep 17 00:00:00 2001 From: AriaLyy <511455842@qq.com> Date: Mon, 5 Dec 2016 18:23:32 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../simple/activity/MultiTaskActivity.java | 146 ++++++++++++------ .../simple/activity/SingleTaskActivity.java | 108 +++++++------ .../simple/adapter/DownloadAdapter.java | 11 +- .../arialyy/downloadutil/core/AMReceiver.java | 59 +++++++ .../arialyy/downloadutil/core/AMTarget.java | 85 +++++++++- .../com/arialyy/downloadutil/core/Aria.java | 67 +------- .../downloadutil/core/AriaManager.java | 83 ++++++++-- .../downloadutil/core/DownloadManager.java | 1 - .../core/scheduler/DownloadSchedulers.java | 28 +++- .../core/scheduler/OnSchedulerListener.java | 10 ++ .../arialyy/downloadutil/core/task/Task.java | 29 ++-- .../arialyy/downloadutil/util/CommonUtil.java | 13 +- 12 files changed, 424 insertions(+), 216 deletions(-) create mode 100644 downloadutil/src/main/java/com/arialyy/downloadutil/core/AMReceiver.java diff --git a/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java b/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java index e1d00c38..8ce713eb 100644 --- a/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/activity/MultiTaskActivity.java @@ -27,8 +27,11 @@ import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import butterknife.Bind; +import com.arialyy.downloadutil.core.AMTarget; +import com.arialyy.downloadutil.core.Aria; import com.arialyy.downloadutil.core.DownloadEntity; import com.arialyy.downloadutil.core.DownloadManager; +import com.arialyy.downloadutil.core.task.Task; import com.arialyy.frame.util.show.L; import com.arialyy.simple.R; import com.arialyy.simple.adapter.DownloadAdapter; @@ -58,53 +61,53 @@ public class MultiTaskActivity extends BaseActivity { mList.setAdapter(mAdapter); } - private BroadcastReceiver mReceiver = new BroadcastReceiver() { - long len = 0; - - @Override public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - DownloadEntity entity = intent.getParcelableExtra(DownloadManager.ENTITY); - switch (action) { - case DownloadManager.ACTION_PRE: - L.d(TAG, "download pre"); - mAdapter.updateState(entity); - break; - case DownloadManager.ACTION_POST_PRE: - len = entity.getFileSize(); - L.d(TAG, "download post pre"); - break; - case DownloadManager.ACTION_START: - L.d(TAG, "download start"); - break; - case DownloadManager.ACTION_RESUME: - L.d(TAG, "download resume"); - long location = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 1); - mAdapter.updateState(entity); - break; - case DownloadManager.ACTION_RUNNING: - long current = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 0); - long speed = intent.getLongExtra(DownloadManager.CURRENT_SPEED, 0); - //mAdapter.setProgress(entity.getDownloadUrl(), current, speed); - mAdapter.setProgress(entity); - break; - case DownloadManager.ACTION_STOP: - L.d(TAG, "download stop"); - mAdapter.updateState(entity); - break; - case DownloadManager.ACTION_COMPLETE: - L.d(TAG, "download complete"); - mAdapter.updateState(entity); - break; - case DownloadManager.ACTION_CANCEL: - L.d(TAG, "download cancel"); - mAdapter.updateState(entity); - break; - case DownloadManager.ACTION_FAIL: - L.d(TAG, "download fail"); - break; - } - } - }; + //private BroadcastReceiver mReceiver = new BroadcastReceiver() { + // long len = 0; + // + // @Override public void onReceive(Context context, Intent intent) { + // String action = intent.getAction(); + // DownloadEntity entity = intent.getParcelableExtra(DownloadManager.ENTITY); + // switch (action) { + // case DownloadManager.ACTION_PRE: + // L.d(TAG, "download pre"); + // mAdapter.updateState(entity); + // break; + // case DownloadManager.ACTION_POST_PRE: + // len = entity.getFileSize(); + // L.d(TAG, "download post pre"); + // break; + // case DownloadManager.ACTION_START: + // L.d(TAG, "download start"); + // break; + // case DownloadManager.ACTION_RESUME: + // L.d(TAG, "download resume"); + // long location = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 1); + // mAdapter.updateState(entity); + // break; + // case DownloadManager.ACTION_RUNNING: + // long current = intent.getLongExtra(DownloadManager.CURRENT_LOCATION, 0); + // long speed = intent.getLongExtra(DownloadManager.CURRENT_SPEED, 0); + // //mAdapter.setProgress(entity.getDownloadUrl(), current, speed); + // mAdapter.setProgress(entity); + // break; + // case DownloadManager.ACTION_STOP: + // L.d(TAG, "download stop"); + // mAdapter.updateState(entity); + // break; + // case DownloadManager.ACTION_COMPLETE: + // L.d(TAG, "download complete"); + // mAdapter.updateState(entity); + // break; + // case DownloadManager.ACTION_CANCEL: + // L.d(TAG, "download cancel"); + // mAdapter.updateState(entity); + // break; + // case DownloadManager.ACTION_FAIL: + // L.d(TAG, "download fail"); + // break; + // } + // } + //}; public void onClick(View view){ DownloadNumDialog dialog = new DownloadNumDialog(this); @@ -113,12 +116,13 @@ public class MultiTaskActivity extends BaseActivity { @Override protected void onResume() { super.onResume(); - registerReceiver(mReceiver, getModule(DownloadModule.class).getDownloadFilter()); + //registerReceiver(mReceiver, getModule(DownloadModule.class).getDownloadFilter()); + Aria.whit(this).addSchedulerListener(new MySchedulerListener()); } @Override protected void onDestroy() { super.onDestroy(); - unregisterReceiver(mReceiver); + //unregisterReceiver(mReceiver); } @Override protected void dataCallback(int result, Object data) { @@ -127,4 +131,48 @@ public class MultiTaskActivity extends BaseActivity { mAdapter.setDownloadNum(Integer.parseInt(data + "")); } } + + private class MySchedulerListener extends AMTarget.SimpleSchedulerListener{ + @Override public void onTaskPre(Task task) { + super.onTaskPre(task); + L.d(TAG, "download pre"); + mAdapter.updateState(task.getDownloadEntity()); + } + + @Override public void onTaskStart(Task task) { + super.onTaskStart(task); + L.d(TAG, "download start"); + } + + @Override public void onTaskResume(Task task) { + super.onTaskResume(task); + L.d(TAG, "download resume"); + mAdapter.updateState(task.getDownloadEntity()); + } + + @Override public void onTaskRunning(Task task) { + super.onTaskRunning(task); + mAdapter.setProgress(task.getDownloadEntity()); + } + + @Override public void onTaskStop(Task task) { + super.onTaskStop(task); + mAdapter.updateState(task.getDownloadEntity()); + } + + @Override public void onTaskCancel(Task task) { + super.onTaskCancel(task); + mAdapter.updateState(task.getDownloadEntity()); + } + + @Override public void onTaskComplete(Task task) { + super.onTaskComplete(task); + mAdapter.updateState(task.getDownloadEntity()); + } + + @Override public void onTaskFail(Task task) { + super.onTaskFail(task); + L.d(TAG, "download fail"); + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java index 4acabf89..515e26d5 100644 --- a/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/activity/SingleTaskActivity.java @@ -28,11 +28,10 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import butterknife.Bind; +import com.arialyy.downloadutil.core.AMReceiver; +import com.arialyy.downloadutil.core.AMTarget; +import com.arialyy.downloadutil.core.Aria; import com.arialyy.downloadutil.core.DownloadEntity; -import com.arialyy.downloadutil.core.DownloadManager; -import com.arialyy.downloadutil.core.command.CmdFactory; -import com.arialyy.downloadutil.core.command.IDownloadCmd; -import com.arialyy.downloadutil.core.scheduler.OnSchedulerListener; import com.arialyy.downloadutil.core.task.Task; import com.arialyy.downloadutil.orm.DbEntity; import com.arialyy.downloadutil.util.CommonUtil; @@ -54,8 +53,6 @@ public class SingleTaskActivity extends BaseActivity { private Button mStart, mStop, mCancel; private TextView mSize; @Bind(R.id.toolbar) Toolbar toolbar; - private CmdFactory mFactory; - private DownloadManager mManager; private DownloadEntity mEntity; private BroadcastReceiver mReceiver; @@ -69,6 +66,7 @@ public class SingleTaskActivity extends BaseActivity { case DOWNLOAD_PRE: mSize.setText(CommonUtil.formatFileSize((Long) msg.obj)); setBtState(false); + mStart.setText("暂停"); break; case DOWNLOAD_FAILE: Toast.makeText(SingleTaskActivity.this, "下载失败", Toast.LENGTH_SHORT).show(); @@ -89,6 +87,7 @@ public class SingleTaskActivity extends BaseActivity { //Toast.makeText(SingleTaskActivity.this, // "恢复下载,恢复位置 ==> " + CommonUtil.formatFileSize((Long) msg.obj), Toast.LENGTH_SHORT) // .show(); + mStart.setText("暂停"); setBtState(false); break; case DOWNLOAD_COMPLETE: @@ -119,6 +118,7 @@ public class SingleTaskActivity extends BaseActivity { //IntentFilter filter = getModule(DownloadModule.class).getDownloadFilter(); //mReceiver = getModule(DownloadModule.class).createReceiver(mUpdateHandler); //registerReceiver(mReceiver, filter); + Aria.whit(this).addSchedulerListener(new MySchedulerListener()); } @Override protected void onDestroy() { @@ -143,8 +143,8 @@ public class SingleTaskActivity extends BaseActivity { mStop = (Button) findViewById(R.id.stop); mCancel = (Button) findViewById(R.id.cancel); mSize = (TextView) findViewById(R.id.size); - mFactory = CmdFactory.getInstance(); - mManager = DownloadManager.getInstance(); + //mFactory = CmdFactory.getInstance(); + //mManager = DownloadManager.getInstance(); mEntity = DbEntity.findData(DownloadEntity.class, new String[] { "downloadUrl" }, new String[] { mDownloadUrl }); if (mEntity != null) { @@ -184,65 +184,61 @@ public class SingleTaskActivity extends BaseActivity { } private void resume(){ - IDownloadCmd startCmd = mFactory.createCmd(mEntity, CmdFactory.TASK_START); - mManager.setCmd(startCmd).exe(); - mUpdateHandler.obtainMessage(DOWNLOAD_RESUME, mEntity.getCurrentProgress()).sendToTarget(); + Aria.whit(this).load(mEntity).resume(); } private void start() { mEntity.setFileName("test.apk"); mEntity.setDownloadUrl(mDownloadUrl); mEntity.setDownloadPath(Environment.getExternalStorageDirectory().getPath() + "/test.apk"); - //List commands = new ArrayList<>(); - //IDownloadCmd addCMD = mFactory.createCmd(mEntity, CmdFactory.TASK_CREATE); - //IDownloadCmd startCmd = mFactory.createCmd(mEntity, CmdFactory.TASK_START); - //commands.add(addCMD); - //commands.add(startCmd); - //mManager.setCmds(commands).exe(); - mManager.setCmd(CmdFactory.getInstance().createCmd(mEntity, CmdFactory.TASK_SINGLE)) - .addSchedulerListener(new OnSchedulerListener() { - @Override public void onTaskStart(Task task) { - mUpdateHandler.obtainMessage(DOWNLOAD_PRE, task.getDownloadEntity().getFileSize()) - .sendToTarget(); - } - - @Override public void onTaskStop(Task task) { - mUpdateHandler.sendEmptyMessage(DOWNLOAD_STOP); - } - - @Override public void onTaskCancel(Task task) { - mUpdateHandler.sendEmptyMessage(DOWNLOAD_CANCEL); - } - - @Override public void onTaskFail(Task task) { - mUpdateHandler.sendEmptyMessage(DOWNLOAD_FAILE); - } - - @Override public void onTaskComplete(Task task) { - mUpdateHandler.sendEmptyMessage(DOWNLOAD_COMPLETE); - } - - @Override public void onTaskRunning(Task task) { - //L.d(TAG, task.getDownloadEntity().getCurrentProgress() + ""); - long current = task.getDownloadEntity().getCurrentProgress(); - long len = task.getDownloadEntity().getFileSize(); - if (len == 0) { - mPb.setProgress(0); - } else { - mPb.setProgress((int) ((current * 100) / len)); - } - } - }) - .exe(); + Aria.whit(this).load(mEntity).start(); } private void stop() { - IDownloadCmd stopCmd = mFactory.createCmd(mEntity, CmdFactory.TASK_STOP); - mManager.setCmd(stopCmd).exe(); + Aria.whit(this).load(mEntity).stop(); } private void cancel() { - IDownloadCmd cancelCmd = mFactory.createCmd(mEntity, CmdFactory.TASK_CANCEL); - mManager.setCmd(cancelCmd).exe(); + Aria.whit(this).load(mEntity).cancel(); } + + private class MySchedulerListener extends AMTarget.SimpleSchedulerListener{ + @Override public void onTaskStart(Task task) { + mUpdateHandler.obtainMessage(DOWNLOAD_PRE, task.getDownloadEntity().getFileSize()) + .sendToTarget(); + } + + @Override public void onTaskResume(Task task) { + super.onTaskResume(task); + mUpdateHandler.obtainMessage(DOWNLOAD_PRE, task.getDownloadEntity().getFileSize()) + .sendToTarget(); + } + + @Override public void onTaskStop(Task task) { + mUpdateHandler.sendEmptyMessage(DOWNLOAD_STOP); + } + + @Override public void onTaskCancel(Task task) { + mUpdateHandler.sendEmptyMessage(DOWNLOAD_CANCEL); + } + + @Override public void onTaskFail(Task task) { + mUpdateHandler.sendEmptyMessage(DOWNLOAD_FAILE); + } + + @Override public void onTaskComplete(Task task) { + mUpdateHandler.sendEmptyMessage(DOWNLOAD_COMPLETE); + } + + @Override public void onTaskRunning(Task task) { + long current = task.getDownloadEntity().getCurrentProgress(); + long len = task.getDownloadEntity().getFileSize(); + if (len == 0) { + mPb.setProgress(0); + } else { + mPb.setProgress((int) ((current * 100) / len)); + } + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java b/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java index 6686d36a..15f26222 100644 --- a/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java +++ b/app/src/main/java/com/arialyy/simple/adapter/DownloadAdapter.java @@ -25,6 +25,7 @@ import android.widget.TextView; import butterknife.Bind; import com.arialyy.absadapter.common.AbsHolder; import com.arialyy.absadapter.recycler_view.AbsRVAdapter; +import com.arialyy.downloadutil.core.Aria; import com.arialyy.downloadutil.core.DownloadEntity; import com.arialyy.downloadutil.core.DownloadManager; import com.arialyy.downloadutil.core.command.CmdFactory; @@ -188,13 +189,15 @@ public class DownloadAdapter extends AbsRVAdapter cmds = new ArrayList<>(); + cmds.add(CommonUtil.createCmd(receiver.entity, CmdFactory.TASK_CREATE)); + cmds.add(CommonUtil.createCmd(receiver.entity, CmdFactory.TASK_START)); + receiver.manager.setCmds(cmds).exe(); + } -} \ No newline at end of file + /** + * 停止下载 + */ + public void stop() { + receiver.manager.setCmd(CommonUtil.createCmd(receiver.entity, CmdFactory.TASK_STOP)).exe(); + } + + /** + * 恢复下载 + */ + public void resume() { + receiver.manager.setCmd(CommonUtil.createCmd(receiver.entity, CmdFactory.TASK_START)).exe(); + } + + /** + * 取消下载 + */ + public void cancel() { + receiver.manager.setCmd(CommonUtil.createCmd(receiver.entity, CmdFactory.TASK_CANCEL)).exe(); + } + + public static class SimpleSchedulerListener implements OnSchedulerListener { + + @Override public void onTaskPre(Task task) { + + } + + @Override public void onTaskResume(Task task) { + + } + + @Override public void onTaskStart(Task task) { + + } + + @Override public void onTaskStop(Task task) { + + } + + @Override public void onTaskCancel(Task task) { + + } + + @Override public void onTaskFail(Task task) { + + } + + @Override public void onTaskComplete(Task task) { + + } + + @Override public void onTaskRunning(Task task) { + + } + } +} diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/Aria.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/Aria.java index d5576bef..4e77ad6e 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/Aria.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/Aria.java @@ -19,14 +19,10 @@ package com.arialyy.downloadutil.core; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; -import com.arialyy.downloadutil.core.command.CmdFactory; -import com.arialyy.downloadutil.core.command.IDownloadCmd; -import com.arialyy.downloadutil.core.scheduler.OnSchedulerListener; -import java.util.ArrayList; -import java.util.List; /** * Created by lyy on 2016/12/1. + * Aria启动,管理全局任务 */ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) public class Aria { @@ -38,64 +34,11 @@ public class Aria { //mDownloadManager = DownloadManager.getInstance(); } - private Aria(Context context) { - mDownloadManager = DownloadManager.init(context); + public static AMReceiver whit(Context context) { + return AriaManager.getInstance(context).get(context); } - public static AMTarget whit(Context context) { - AMTarget target = AriaManager.getInstance(context).get(context); - return target; - } - - /** - * 开始下载 - */ - public Aria start(DownloadEntity entity) { - List cmds = new ArrayList<>(); - cmds.add(createCmd(entity, CmdFactory.TASK_CREATE)); - cmds.add(createCmd(entity, CmdFactory.TASK_START)); - mDownloadManager.setCmds(cmds).exe(); - return this; - } - - /** - * 停止下载 - */ - public void stop(DownloadEntity entity) { - mDownloadManager.setCmd(createCmd(entity, CmdFactory.TASK_STOP)).exe(); - } - - /** - * 恢复下载 - */ - public void resume(DownloadEntity entity) { - mDownloadManager.setCmd(createCmd(entity, CmdFactory.TASK_START)).exe(); - } - - /** - * 取消下载 - */ - public void cancel(DownloadEntity entity) { - mDownloadManager.setCmd(createCmd(entity, CmdFactory.TASK_CANCEL)).exe(); - } - - /** - * 添加调度器回调 - */ - public Aria addSchedulerListener(Context context, OnSchedulerListener listener) { - //mDownloadManager.getTaskQueue().getDownloadSchedulers().addSchedulerListener(listener); - return this; - } - - /** - * 移除回调 - */ - public Aria removeSchedulerListener(Context context) { - //mDownloadManager.getTaskQueue().getDownloadSchedulers().removeSchedulerListener(listener); - return this; - } - - private IDownloadCmd createCmd(DownloadEntity entity, int cmd) { - return CmdFactory.getInstance().createCmd(entity, cmd); + public static AriaManager get(Context context){ + return AriaManager.getInstance(context); } } diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/AriaManager.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/AriaManager.java index 41b53583..9135e610 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/AriaManager.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/AriaManager.java @@ -3,28 +3,36 @@ package com.arialyy.downloadutil.core; import android.annotation.TargetApi; import android.app.Activity; import android.app.Application; +import android.app.Service; import android.content.Context; import android.os.Build; import android.os.Bundle; +import com.arialyy.downloadutil.core.command.CmdFactory; +import com.arialyy.downloadutil.core.command.IDownloadCmd; +import com.arialyy.downloadutil.util.CommonUtil; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Set; /** * Created by lyy on 2016/12/1. + * Aria管理器,任务操作在这里执行 */ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public class AriaManager { - private static final Object LOCK = new Object(); - private static volatile AriaManager INSTANCE = null; - private Map mTargets = new HashMap<>(); + private static final Object LOCK = new Object(); + private static volatile AriaManager INSTANCE = null; + private Map mTargets = new HashMap<>(); private DownloadManager mManager; - private LifeCallback mLifeCallback; + private LifeCallback mLifeCallback; private AriaManager(Context context) { regAppLifeCallback(context); mManager = DownloadManager.init(context); } - public static AriaManager getInstance(Context context) { + static AriaManager getInstance(Context context) { if (INSTANCE == null) { synchronized (LOCK) { INSTANCE = new AriaManager(context); @@ -33,21 +41,59 @@ import java.util.Map; return INSTANCE; } - public AMTarget get(Context context){ + AMReceiver get(Context context) { return getTarget(context); } - private void putTarget(Context context) { - String clsName = context.getClass().getName(); - AMTarget target = mTargets.get(clsName); + /** + * 停止所有正在执行的任务 + */ + 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)); + } + } + mManager.setCmds(stopCmds).exe(); + } + + /** + * 删除所有任务 + */ + public void cancelAllTask() { + List allEntity = mManager.getAllDownloadEntity(); + List cancelCmds = new ArrayList<>(); + for (DownloadEntity entity : allEntity) { + cancelCmds.add(CommonUtil.createCmd(entity, CmdFactory.TASK_CANCEL)); + } + mManager.setCmds(cancelCmds).exe(); + Set keys = mTargets.keySet(); + for (String key : keys) { + AMReceiver target = mTargets.get(key); + target.removeSchedulerListener(); + mTargets.remove(key); + } + } + + private AMReceiver putTarget(Context context) { + String clsName = context.getClass().getName(); + AMReceiver target = mTargets.get(clsName); if (target == null) { - target = new AMTarget(); + target = new AMReceiver(); + target.context = context; mTargets.put(clsName, target); } + return target; } - private AMTarget getTarget(Context context) { - return mTargets.get(context.getClass().getName()); + private AMReceiver getTarget(Context context) { + AMReceiver target = mTargets.get(context.getClass().getName()); + if (target == null) { + target = putTarget(context); + } + return target; } /** @@ -91,7 +137,18 @@ import java.util.Map; } @Override public void onActivityDestroyed(Activity activity) { - + Set keys = mTargets.keySet(); + for (String key : keys) { + if (key.equals(activity.getClass().getName())) { + AMReceiver target = mTargets.get(key); + if (target.context != null) { + if (target.context instanceof Application || target.context instanceof Service) break; + target.removeSchedulerListener(); + mTargets.remove(key); + } + break; + } + } } } } diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java index bf68a2d7..b5a6ce18 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/DownloadManager.java @@ -86,7 +86,6 @@ public class DownloadManager { private List mCommands = new ArrayList<>(); private Context mContext; private ITaskQueue mTaskQueue; - private DownloadEntity mTempDEntity; private DownloadManager() { diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/DownloadSchedulers.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/DownloadSchedulers.java index 747f93f6..ac995e90 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/DownloadSchedulers.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/DownloadSchedulers.java @@ -19,8 +19,6 @@ package com.arialyy.downloadutil.core.scheduler; import android.content.Context; import android.os.Message; import android.util.Log; -import android.util.SparseArray; -import android.util.SparseIntArray; import com.arialyy.downloadutil.core.DownloadEntity; import com.arialyy.downloadutil.core.queue.ITaskQueue; import com.arialyy.downloadutil.core.task.Task; @@ -28,13 +26,17 @@ import com.arialyy.downloadutil.core.queue.pool.ExecutePool; import com.arialyy.downloadutil.core.queue.DownloadTaskQueue; import java.util.HashMap; import java.util.Map; -import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * Created by lyy on 2016/8/16. * 任务下载器,提供抽象的方法供具体的实现类操作 */ public class DownloadSchedulers implements IDownloadSchedulers { + /** + * 任务预加载 + */ + public static final int PRE = 0; /** * 任务开始 */ @@ -59,6 +61,10 @@ public class DownloadSchedulers implements IDownloadSchedulers { * 下载中 */ public static final int RUNNING = 6; + /** + * 恢复下载 + */ + public static final int RESUME = 7; private static final String TAG = "DownloadSchedulers"; private static final Object LOCK = new Object(); private static volatile DownloadSchedulers INSTANCE = null; @@ -75,8 +81,7 @@ public class DownloadSchedulers implements IDownloadSchedulers { /** * 下载器任务监听 */ - OnSchedulerListener mSchedulerListener; - Map mSchedulerListeners = new HashMap<>(); + Map mSchedulerListeners = new ConcurrentHashMap<>(); ITaskQueue mQueue; public DownloadSchedulers(ITaskQueue downloadTaskQueue) { @@ -134,6 +139,10 @@ public class DownloadSchedulers implements IDownloadSchedulers { private void callback(int state, DownloadEntity entity, OnSchedulerListener listener) { if (listener != null) { Task task = mQueue.getTask(entity); + if (task == null) { + Log.e(TAG, "队列中没有下载链接【" + entity.getDownloadUrl() + "】的任务"); + return; + } switch (state) { case RUNNING: listener.onTaskRunning(task); @@ -144,6 +153,12 @@ public class DownloadSchedulers implements IDownloadSchedulers { case STOP: listener.onTaskStop(task); break; + case RESUME: + listener.onTaskResume(task); + break; + case PRE: + listener.onTaskPre(task); + break; case CANCEL: listener.onTaskCancel(task); removeSchedulerListener(listener); @@ -191,7 +206,8 @@ public class DownloadSchedulers implements IDownloadSchedulers { } } - @Override public void addSchedulerListener(Context context, OnSchedulerListener schedulerListener) { + @Override + public void addSchedulerListener(Context context, OnSchedulerListener schedulerListener) { mSchedulerListeners.put(schedulerListener.hashCode(), schedulerListener); } diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/OnSchedulerListener.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/OnSchedulerListener.java index 313d161f..e05b0ad4 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/OnSchedulerListener.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/scheduler/OnSchedulerListener.java @@ -6,6 +6,16 @@ import com.arialyy.downloadutil.core.task.Task; * Target处理任务监听 */ public interface OnSchedulerListener { + /** + * 任务预加载 + */ + public void onTaskPre(Task task); + + /** + * 任务恢复下载 + */ + public void onTaskResume(Task task); + /** * 任务开始 */ diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/core/task/Task.java b/downloadutil/src/main/java/com/arialyy/downloadutil/core/task/Task.java index 33f0fab5..434f6907 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/core/task/Task.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/core/task/Task.java @@ -14,7 +14,6 @@ * limitations under the License. */ - package com.arialyy.downloadutil.core.task; import android.content.Context; @@ -34,11 +33,11 @@ import com.arialyy.downloadutil.core.scheduler.DownloadSchedulers; public class Task { public static final String TAG = "Task"; - private DownloadEntity mEntity; + private DownloadEntity mEntity; 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) { mContext = context.getApplicationContext(); @@ -129,7 +128,7 @@ public class Task { private Intent createIntent(String action) { Uri.Builder builder = new Uri.Builder(); builder.scheme(mContext.getPackageName()); - Uri uri = builder.build(); + Uri uri = builder.build(); Intent intent = new Intent(action); intent.setData(uri); return intent; @@ -148,8 +147,8 @@ public class Task { public static class Builder { DownloadEntity downloadEntity; - Handler outHandler; - Context context; + Handler outHandler; + Context context; int threadNum = 3; IDownloadUtil downloadUtil; @@ -200,12 +199,12 @@ public class Task { private class DListener extends DownloadListener { Handler outHandler; Context context; - Intent sendIntent; - long INTERVAL = 1024 * 10; //10k大小的间隔 - long lastLen = 0; //上一次发送长度 - long lastTime = 0; - long INTERVAL_TIME = 1000; //1m更新周期 - boolean isFirst = true; + Intent sendIntent; + long INTERVAL = 1024 * 10; //10k大小的间隔 + long lastLen = 0; //上一次发送长度 + long lastTime = 0; + long INTERVAL_TIME = 1000; //1m更新周期 + boolean isFirst = true; DownloadEntity downloadEntity; DListener(Context context, DownloadEntity downloadEntity, Handler outHandler) { @@ -226,12 +225,14 @@ public class Task { super.onPostPre(fileSize); downloadEntity.setFileSize(fileSize); downloadEntity.setState(DownloadEntity.STATE_POST_PRE); + sendInState2Target(DownloadSchedulers.PRE); sendIntent(DownloadManager.ACTION_POST_PRE, -1); } @Override public void onResume(long resumeLocation) { super.onResume(resumeLocation); downloadEntity.setState(DownloadEntity.STATE_DOWNLOAD_ING); + sendInState2Target(DownloadSchedulers.RESUME); sendIntent(DownloadManager.ACTION_RESUME, resumeLocation); } diff --git a/downloadutil/src/main/java/com/arialyy/downloadutil/util/CommonUtil.java b/downloadutil/src/main/java/com/arialyy/downloadutil/util/CommonUtil.java index 21ffc588..20272998 100644 --- a/downloadutil/src/main/java/com/arialyy/downloadutil/util/CommonUtil.java +++ b/downloadutil/src/main/java/com/arialyy/downloadutil/util/CommonUtil.java @@ -14,10 +14,12 @@ * limitations under the License. */ - package com.arialyy.downloadutil.util; import android.util.Log; +import com.arialyy.downloadutil.core.DownloadEntity; +import com.arialyy.downloadutil.core.command.CmdFactory; +import com.arialyy.downloadutil.core.command.IDownloadCmd; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -34,6 +36,10 @@ import java.util.Properties; public class CommonUtil { private static final String TAG = "util"; + public static IDownloadCmd createCmd(DownloadEntity entity, int cmd) { + return CmdFactory.getInstance().createCmd(entity, cmd); + } + /** * 获取类里面的所在字段 */ @@ -249,9 +255,8 @@ public class CommonUtil { * 读取下载配置文件 */ public static Properties loadConfig(File file) { - Properties properties = new Properties(); - FileInputStream fis = null; - + Properties properties = new Properties(); + FileInputStream fis = null; try { fis = new FileInputStream(file);