From e6da5230e9a4f2ba33e9fa97bba79b40fd50e86e Mon Sep 17 00:00:00 2001 From: laoyuyu <511455842@qq.com> Date: Sat, 11 May 2019 19:52:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=84=E5=90=88=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=A4=9A=E6=AC=A1=E5=9B=9E=E8=B0=83onStop=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=E7=9A=84=E9=97=AE=E9=A2=98,=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=A4=9A=E6=AC=A1=E9=87=8D=E5=A4=8D=E5=BF=AB=E9=80=9F=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E6=9A=82=E5=81=9C=E3=80=81=E5=BC=80=E5=A7=8B=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E4=BB=BB=E5=8A=A1=E6=9C=89=E5=8F=AF=E8=83=BD=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E4=B8=8B=E8=BD=BD=E7=9A=84=E9=97=AE=E9=A2=98,=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=84=E5=90=88=E4=BB=BB=E5=8A=A1=E4=B8=AD?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E7=AD=89=E5=BE=85=E4=B8=AD=E7=9A=84=E5=8F=AA?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AE=9E=E4=BD=93=E4=BF=9D=E5=AD=98=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aria/core/command/normal/StartCmd.java | 13 ++-- .../arialyy/aria/core/common/AbsFileer.java | 19 +++--- .../aria/core/common/AbsThreadTask.java | 18 +----- .../aria/core/common/StateConstance.java | 2 - .../core/common/http/HttpHeaderDelegate.java | 12 ++-- .../aria/core/download/AbsGroupDelegate.java | 2 +- .../aria/core/download/DownloadTarget.java | 7 ++- .../aria/core/download/HttpGroupDelegate.java | 7 ++- .../core/download/downloader/Downloader.java | 1 - .../download/downloader/FtpThreadTask.java | 4 -- .../downloader/HttpFileInfoThread.java | 2 + .../download/downloader/HttpThreadTask.java | 5 -- .../core/download/group/AbsGroupUtil.java | 22 ++++--- .../download/group/DownloadGroupUtil.java | 17 +++++- .../aria/core/download/group/ISubQueue.java | 7 ++- .../core/download/group/SimpleSchedulers.java | 15 ++++- .../core/download/group/SimpleSubQueue.java | 34 ++++++++++- .../download/group/SubDownloadLoader.java | 29 +++++---- .../com/arialyy/aria/core/inf/AbsTask.java | 1 + .../aria/core/manager/ThreadTaskManager.java | 4 ++ .../core/upload/uploader/FtpThreadTask.java | 2 - .../core/upload/uploader/HttpThreadTask.java | 11 ++-- DEV_LOG.md | 4 ++ .../core/download/SingleTaskActivity.java | 59 ++++++++++--------- .../download/group/DownloadGroupActivity.java | 35 ++++------- 25 files changed, 189 insertions(+), 143 deletions(-) diff --git a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java index 72e46b7b..badbae61 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java +++ b/Aria/src/main/java/com/arialyy/aria/core/command/normal/StartCmd.java @@ -72,13 +72,16 @@ class StartCmd extends AbsNormalCmd { int state = task.getState(); if (mQueue.getCurrentExePoolNum() < maxTaskNum) { if (state == IEntity.STATE_STOP - || task.getState() == IEntity.STATE_FAIL - || task.getState() == IEntity.STATE_OTHER - || task.getState() == IEntity.STATE_PRE - || task.getState() == IEntity.STATE_POST_PRE - || task.getState() == IEntity.STATE_COMPLETE) { + || state == IEntity.STATE_FAIL + || state == IEntity.STATE_OTHER + || state == IEntity.STATE_PRE + || state == IEntity.STATE_POST_PRE + || state == IEntity.STATE_COMPLETE) { resumeTask(); + } else if (state == IEntity.STATE_RUNNING) { + ALog.w(TAG, String.format("任务【%s】已经在运行", task.getTaskName())); } else { + ALog.d(TAG, String.format("开始新任务, 任务状态:%s", state)); startTask(); } } else { diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java index 844c2934..dbf1f6f0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsFileer.java @@ -16,7 +16,6 @@ package com.arialyy.aria.core.common; import android.content.Context; -import android.os.Looper; import android.util.SparseArray; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.download.BaseDListener; @@ -125,7 +124,7 @@ public abstract class AbsFileer= 0) { mListener.onProgress(mConstance.CURRENT_LOCATION); @@ -252,7 +251,9 @@ public abstract class AbsFileer if (adapter == null) { throw new IllegalArgumentException("adapter为空"); } - try { - adapter.clone(); - mTarget.getTaskWrapper().asHttp().setFileLenAdapter((IHttpFileLenAdapter) adapter.clone()); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } + //try { + // adapter.clone(); + mTarget.getTaskWrapper().asHttp().setFileLenAdapter((IHttpFileLenAdapter) adapter); + //} catch (CloneNotSupportedException e) { + // e.printStackTrace(); + //} //// 以下代码有问题,匿名内部类不能序列化 //String objPath = String.format("%s/obj_temp/%s", AriaManager.APP.getFilesDir().getPath(), // adapter.hashCode()); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/AbsGroupDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/download/AbsGroupDelegate.java index b2fe174b..03a8aae5 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/AbsGroupDelegate.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/AbsGroupDelegate.java @@ -78,7 +78,7 @@ abstract class AbsGroupDelegate implements IGroupTar void reChangeDirPath(String newDirPath) { List subTasks = mWrapper.getSubTaskWrapper(); if (subTasks != null && !subTasks.isEmpty()) { - List des = new ArrayList<>(); + List des = new ArrayList<>(); for (DTaskWrapper dte : subTasks) { DownloadEntity de = dte.getEntity(); String oldPath = de.getDownloadPath(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java index 76af4ad4..ff654c20 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/DownloadTarget.java @@ -20,6 +20,7 @@ import android.support.annotation.NonNull; import com.arialyy.aria.core.common.http.GetDelegate; import com.arialyy.aria.core.common.http.HttpHeaderDelegate; import com.arialyy.aria.core.common.http.PostDelegate; +import com.arialyy.aria.core.inf.AbsHttpFileLenAdapter; import com.arialyy.aria.core.inf.IHttpFileLenAdapter; import com.arialyy.aria.core.inf.IHttpHeaderDelegate; import java.net.Proxy; @@ -102,9 +103,9 @@ public class DownloadTarget extends AbsDTarget /** * 如果你需要使用header中特定的key来设置文件长度,或有定制文件长度的需要,那么你可以通过该方法自行处理文件长度 */ - public DownloadTarget setFileLenAdapter(IHttpFileLenAdapter adapter) { - //return mHeaderDelegate.setFileLenAdapter(adapter); - return this; + public DownloadTarget setFileLenAdapter(AbsHttpFileLenAdapter adapter) { + return mHeaderDelegate.setFileLenAdapter(adapter); + //return this; } /** diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/HttpGroupDelegate.java b/Aria/src/main/java/com/arialyy/aria/core/download/HttpGroupDelegate.java index 3f3436d8..3cfcc6e9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/HttpGroupDelegate.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/HttpGroupDelegate.java @@ -125,7 +125,7 @@ class HttpGroupDelegate extends AbsGroupDelegate { } } - getEntity().save(); + saveEntity(); if (isNeedModifyPath()) { reChangeDirPath(getDirPathTemp()); @@ -137,6 +137,11 @@ class HttpGroupDelegate extends AbsGroupDelegate { return true; } + private void saveEntity(){ + getEntity().save(); + DbEntity.saveAll(getEntity().getSubEntities()); + } + /** * 更新所有改动的子任务文件名 */ diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java index c76c5578..ce76f484 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/Downloader.java @@ -124,7 +124,6 @@ public class Downloader extends AbsFileer { private void failDownload(BaseException e) { closeTimer(); - mConstance.isRunning = false; mListener.onFail(false, e); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java index 466f69f7..3bc29121 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpThreadTask.java @@ -142,19 +142,15 @@ class FtpThreadTask extends AbsFtpThreadTask { if (isBlock) { boolean success = mergeFile(); if (!success) { - //ALog.e(TAG, String.format("任务【%s】分块文件合并失败", getConfig().TEMP_FILE.getName())); - getState().isRunning = false; mListener.onFail(false, new TaskException(TAG, String.format("任务【%s】分块文件合并失败", getConfig().TEMP_FILE.getName()))); return; } } getState().TASK_RECORD.deleteData(); - getState().isRunning = false; mListener.onComplete(); } if (getState().isFail()) { - getState().isRunning = false; mListener.onFail(false, new TaskException(TAG, String.format("任务【%s】下载失败", getConfig().TEMP_FILE.getName()))); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java index 5ae5eeb8..07cb4bc6 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpFileInfoThread.java @@ -214,6 +214,8 @@ public class HttpFileInfoThread implements Runnable { onFileInfoCallback.onComplete(mEntity.getUrl(), info); } mEntity.update(); + // 销毁文件长度适配器 + mTaskWrapper.asHttp().setFileLenAdapter(null); } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java index 088a183f..f2ef96bc 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/HttpThreadTask.java @@ -279,7 +279,6 @@ final class HttpThreadTask extends AbsThreadTask { } if (getTaskWrapper().asHttp().isChunked()) { ALog.i(TAG, "任务下载完成"); - getState().isRunning = false; mListener.onComplete(); return; } @@ -296,18 +295,15 @@ final class HttpThreadTask extends AbsThreadTask { if (isBlock) { boolean success = mergeFile(); if (!success) { - getState().isRunning = false; mListener.onFail(false, new TaskException(TAG, String.format("任务【%s】分块文件合并失败", getConfig().TEMP_FILE.getName()))); return; } } getState().TASK_RECORD.deleteData(); - getState().isRunning = false; mListener.onComplete(); } if (getState().isFail()) { - getState().isRunning = false; mListener.onFail(false, new TaskException(TAG, String.format("任务【%s】下载失败,filePath: %s, url: %s", getConfig().TEMP_FILE.getName(), @@ -315,7 +311,6 @@ final class HttpThreadTask extends AbsThreadTask { } } else { ALog.i(TAG, "任务下载完成"); - getState().isRunning = false; mListener.onComplete(); } } else { diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/group/AbsGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/group/AbsGroupUtil.java index be585516..cf5af42b 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/group/AbsGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/group/AbsGroupUtil.java @@ -192,22 +192,20 @@ public abstract class AbsGroupUtil implements IUtil, Runnable { @Override public void stop() { isStop = true; closeTimer(); - onStop(); - - Set keys = mExeLoader.keySet(); - mSubQueue.clear(); - - for (String key : keys) { - SubDownloadLoader loader = mExeLoader.get(key); - if (loader != null && loader.isRunning()) { - mSubQueue.stopTask(loader); - } + if (onStop()) { + return; } - mListener.onStop(mCurrentLocation); + mSubQueue.stopAllTask(); } - protected void onStop() { + /** + * 子类的钩子 + * + * @return 返回{@code true},直接回调{@link IDownloadGroupListener#onStop(long)} + */ + protected boolean onStop() { + return false; } @Override public void start() { diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/group/DownloadGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/group/DownloadGroupUtil.java index 4c68d4c9..ba11443f 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/group/DownloadGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/group/DownloadGroupUtil.java @@ -27,6 +27,7 @@ import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.exception.AriaIOException; import com.arialyy.aria.exception.BaseException; import com.arialyy.aria.util.ALog; +import com.arialyy.aria.util.CommonUtil; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -38,6 +39,7 @@ public class DownloadGroupUtil extends AbsGroupUtil implements IUtil { private static final String TAG = "DownloadGroupUtil"; private final Object LOCK = new Object(); private ExecutorService mPool = null; + private boolean getLenComplete = false; public DownloadGroupUtil(IDownloadGroupListener listener, DGTaskWrapper taskWrapper) { super(listener, taskWrapper); @@ -51,8 +53,15 @@ public class DownloadGroupUtil extends AbsGroupUtil implements IUtil { super.onCancel(); } - @Override protected void onStop() { - super.onStop(); + @Override protected boolean onStop() { + // 如果是isUnknownSize()标志,并且获取大小没有完成,则直接回调onStop + if (mPool != null && !getLenComplete) { + ALog.d(TAG, "获取长度未完成的情况下,停止组合任务"); + mPool.shutdown(); + mListener.onStop(0); + return true; + } + return false; } @Override protected void onStart() { @@ -121,8 +130,12 @@ public class DownloadGroupUtil extends AbsGroupUtil implements IUtil { for (DTaskWrapper wrapper : mGTWrapper.getSubTaskWrapper()) { size += wrapper.getEntity().getFileSize(); } + mGTWrapper.getEntity().setConvertFileSize(CommonUtil.formatFileSize(size)); mGTWrapper.getEntity().setFileSize(size); mGTWrapper.getEntity().update(); + mGTWrapper.asHttp().setFileLenAdapter(null); + getLenComplete = true; + ALog.d(TAG, String.format("获取组合任务长度完成,len:%s", size)); } else if (failCount == mGTWrapper.getSubTaskWrapper().size()) { mListener.onFail(true, new AriaIOException(TAG, "获取子任务长度失败")); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/group/ISubQueue.java b/Aria/src/main/java/com/arialyy/aria/core/download/group/ISubQueue.java index d8196380..e4f234e3 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/group/ISubQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/group/ISubQueue.java @@ -41,10 +41,15 @@ interface ISubQueue { void startTask(Fileer fileer); /** - * 停止任务 + * 停止单个任务,如果缓存队列中有等待中的任务,则启动等待中的任务 */ void stopTask(Fileer fileer); + /** + * 停止全部任务,停止所有正在执行的任务,并清空所有等待中的端服务 + */ + void stopAllTask(); + /** * 修改最大任务数 * diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/group/SimpleSchedulers.java b/Aria/src/main/java/com/arialyy/aria/core/download/group/SimpleSchedulers.java index e3ccde58..6d1bc125 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/group/SimpleSchedulers.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/group/SimpleSchedulers.java @@ -41,7 +41,7 @@ class SimpleSchedulers implements ISchedulers { mGState = state; } - public static SimpleSchedulers newInstance(GroupRunState state) { + static SimpleSchedulers newInstance(GroupRunState state) { return new SimpleSchedulers(state); } @@ -75,7 +75,7 @@ class SimpleSchedulers implements ISchedulers { /** * 处理子任务失败的情况 * 1、子任务失败次数大于等于配置的重试次数,才能认为子任务停止 - * 2、stopNum + failNum + completeNum == subSize,则认为组合任务停止 + * 2、stopNum + failNum + completeNum + cacheNum == subSize,则认为组合任务停止 * 3、failNum == subSize,只有全部的子任务都失败了,才能任务组合任务失败 */ private synchronized void handleFail(final SubDownloadLoader loader) { @@ -96,6 +96,7 @@ class SimpleSchedulers implements ISchedulers { if (mGState.getFailNum() == mGState.getSubSize() || mGState.getStopNum() + mGState.getFailNum() + mGState.getCompleteNum() == mGState.getSubSize()) { + mQueue.clear(); mGState.isRunning = false; mGState.listener.onFail(true, new TaskException(TAG, String.format("任务组【%s】下载失败", mGState.getGroupHash()))); @@ -128,8 +129,12 @@ class SimpleSchedulers implements ISchedulers { mGState.listener.onSubStop(loader.getEntity()); mGState.countStopNum(loader.getKey()); if (mGState.getStopNum() == mGState.getSubSize() - || mGState.getStopNum() + mGState.getCompleteNum() + mGState.getFailNum() + || mGState.getStopNum() + + mGState.getCompleteNum() + + mGState.getFailNum() + + mQueue.getCacheSize() == mGState.getSubSize()) { + mQueue.clear(); mGState.isRunning = false; mGState.listener.onStop(mGState.getProgress()); } else { @@ -158,6 +163,7 @@ class SimpleSchedulers implements ISchedulers { } else { mGState.listener.onStop(mGState.getProgress()); } + mQueue.clear(); mGState.isRunning = false; } else { startNext(); @@ -168,6 +174,9 @@ class SimpleSchedulers implements ISchedulers { * 如果有等待中的任务,则启动下一任务 */ private void startNext() { + if (mQueue.isStopAll()) { + return; + } SubDownloadLoader next = mQueue.getNextTask(); if (next != null) { ALog.d(TAG, String.format("启动任务:%s", next.getEntity().getFileName())); diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/group/SimpleSubQueue.java b/Aria/src/main/java/com/arialyy/aria/core/download/group/SimpleSubQueue.java index 2e261867..5c24e9a9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/group/SimpleSubQueue.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/group/SimpleSubQueue.java @@ -44,6 +44,11 @@ class SimpleSubQueue implements ISubQueue { */ private int mExecSize; + /** + * 是否停止任务任务 + */ + private boolean isStopAll = false; + private SimpleSubQueue() { mExecSize = Configuration.getInstance().dGroupCfg.getSubMaxTaskNum(); } @@ -52,10 +57,21 @@ class SimpleSubQueue implements ISubQueue { return new SimpleSubQueue(); } - public Map getExec() { + Map getExec() { return mExec; } + /** + * 获取缓存队列大小 + */ + int getCacheSize() { + return mCache.size(); + } + + boolean isStopAll() { + return isStopAll; + } + @Override public void addTask(SubDownloadLoader fileer) { mCache.put(fileer.getKey(), fileer); } @@ -64,6 +80,7 @@ class SimpleSubQueue implements ISubQueue { if (mExec.size() < mExecSize) { mCache.remove(fileer.getKey()); mExec.put(fileer.getKey(), fileer); + ALog.d(TAG, String.format("开始执行子任务:%s", fileer.getEntity().getFileName())); fileer.start(); } else { ALog.d(TAG, String.format("执行队列已满,任务进入缓存器中,key: %s", fileer.getKey())); @@ -76,6 +93,19 @@ class SimpleSubQueue implements ISubQueue { mExec.remove(fileer.getKey()); } + @Override public void stopAllTask() { + isStopAll = true; + ALog.d(TAG, "停止组合任务"); + Set keys = mExec.keySet(); + for (String key : keys) { + SubDownloadLoader loader = mExec.get(key); + if (loader != null) { + ALog.d(TAG, String.format("停止子任务:%s", loader.getEntity().getFileName())); + loader.stop(); + } + } + } + @Override public void modifyMaxExecNum(int num) { if (num < 1) { ALog.e(TAG, String.format("修改组合任务子任务队列数失败,num: %s", num)); @@ -102,7 +132,7 @@ class SimpleSubQueue implements ISubQueue { } Collection temp = mCache.values(); mCache.clear(); - ALog.d(TAG, String.format("测试, map size: %s", mCache.size())); + ALog.d(TAG, String.format("测试, cacheSize: %s", mCache.size())); for (SubDownloadLoader cache : caches) { addTask(cache); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/group/SubDownloadLoader.java b/Aria/src/main/java/com/arialyy/aria/core/download/group/SubDownloadLoader.java index abdbe115..12254b48 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/group/SubDownloadLoader.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/group/SubDownloadLoader.java @@ -40,6 +40,7 @@ class SubDownloadLoader implements IUtil { private DTaskWrapper mWrapper; private Handler mSchedulers; private ChildDownloadListener mListener; + private boolean needGetInfo; /** * @param schedulers 调度器 @@ -48,6 +49,7 @@ class SubDownloadLoader implements IUtil { SubDownloadLoader(Handler schedulers, DTaskWrapper taskWrapper, boolean needGetInfo) { mWrapper = taskWrapper; mSchedulers = schedulers; + this.needGetInfo = needGetInfo; mListener = new ChildDownloadListener(mSchedulers, SubDownloadLoader.this); } @@ -91,24 +93,31 @@ class SubDownloadLoader implements IUtil { } @Override public void stop() { - if (mDownloader != null) { + if (mDownloader != null && isRunning()) { mDownloader.stop(); + } else { + mSchedulers.obtainMessage(ISchedulers.STOP, this).sendToTarget(); } } @Override public void start() { if (mWrapper.getRequestType() == AbsTaskWrapper.D_HTTP) { - new Thread(new HttpFileInfoThread(mWrapper, new OnFileInfoCallback() { + if (needGetInfo) { + new Thread(new HttpFileInfoThread(mWrapper, new OnFileInfoCallback() { - @Override public void onComplete(String url, CompleteInfo info) { - mDownloader = new Downloader(mListener, mWrapper); - mDownloader.start(); - } + @Override public void onComplete(String url, CompleteInfo info) { + mDownloader = new Downloader(mListener, mWrapper); + mDownloader.start(); + } - @Override public void onFail(AbsEntity entity, BaseException e, boolean needRetry) { - mSchedulers.obtainMessage(ISchedulers.FAIL, SubDownloadLoader.this); - } - })).start(); + @Override public void onFail(AbsEntity entity, BaseException e, boolean needRetry) { + mSchedulers.obtainMessage(ISchedulers.FAIL, SubDownloadLoader.this); + } + })).start(); + } else { + mDownloader = new Downloader(mListener, mWrapper); + mDownloader.start(); + } } else if (mWrapper.getRequestType() == AbsTaskWrapper.D_FTP) { mDownloader = new Downloader(mListener, mWrapper); mDownloader.start(); diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java index e32886f9..2ef76362 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/AbsTask.java @@ -191,6 +191,7 @@ public abstract class AbsTask { getState().COMPLETE_THREAD_NUM++; if (getState().isComplete()) { getState().TASK_RECORD.deleteData(); - getState().isRunning = false; mListener.onComplete(); } if (getState().isFail()) { - getState().isRunning = false; mListener.onFail(false, new TaskException(TAG, String.format("上传失败,filePath: %s, uploadUrl: %s", getEntity().getFilePath(), getConfig().URL))); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java index cfb9b99f..3fb76e55 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/uploader/HttpThreadTask.java @@ -114,7 +114,6 @@ class HttpThreadTask extends AbsThreadTask { private void fail(BaseException e1) { try { mListener.onFail(true, e1); - getState().isRunning = false; if (mOutputStream != null) { mOutputStream.close(); } @@ -181,11 +180,11 @@ class HttpThreadTask extends AbsThreadTask { inputStream.close(); writer.append(LINE_END); writer.flush(); - if (getState().isCancel) { - getState().isRunning = false; - return; - } - getState().isRunning = false; + //if (getState().isCancel) { + // getState().isRunning = false; + // return; + //} + //getState().isRunning = false; } /** diff --git a/DEV_LOG.md b/DEV_LOG.md index ed590c27..33b1bc55 100644 --- a/DEV_LOG.md +++ b/DEV_LOG.md @@ -13,6 +13,10 @@ - 组合任务新增`unknownSize()`,用于处理组合任务大小未知的情况,https://github.com/AriaLyy/Aria/issues/380 - 优化`AbsThreadTask`代码 - 新增文件长度处理功能 https://github.com/AriaLyy/Aria/issues/393 + - 修复组合任务多次回调`onStop`注解的问题 + - 优化`isRunning()`的逻辑,任务是否在执行的判断将更加准确 + - 修复多次重复快速点击`暂停、开始`时,任务有可能重复下载的问题 + - 修复组合任务中没有等待中的只任务实体保存失败的问题 + v_3.6.3 (2019/4/2) - fix bug https://github.com/AriaLyy/Aria/issues/377 + v_3.6.2 (2019/4/1) diff --git a/app/src/main/java/com/arialyy/simple/core/download/SingleTaskActivity.java b/app/src/main/java/com/arialyy/simple/core/download/SingleTaskActivity.java index 2a93f2e7..90cb62d1 100644 --- a/app/src/main/java/com/arialyy/simple/core/download/SingleTaskActivity.java +++ b/app/src/main/java/com/arialyy/simple/core/download/SingleTaskActivity.java @@ -19,6 +19,7 @@ package com.arialyy.simple.core.download; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.graphics.Bitmap; import android.os.Bundle; import android.os.Environment; import android.text.TextUtils; @@ -36,6 +37,7 @@ import com.arialyy.aria.core.download.DTaskWrapper; import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadTarget; import com.arialyy.aria.core.download.DownloadTask; +import com.arialyy.aria.core.inf.AbsHttpFileLenAdapter; import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.IHttpFileLenAdapter; import com.arialyy.aria.core.scheduler.ISchedulers; @@ -47,6 +49,10 @@ import com.arialyy.simple.R; import com.arialyy.simple.base.BaseActivity; import com.arialyy.simple.databinding.ActivitySingleBinding; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; +import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; +import com.bumptech.glide.load.resource.transcode.BitmapBytesTranscoder; import java.io.File; import java.util.HashMap; import java.util.List; @@ -72,6 +78,7 @@ public class SingleTaskActivity extends BaseActivity { Button mStop; Button mCancel; RadioGroup mRg; + DownloadTarget target; BroadcastReceiver receiver = new BroadcastReceiver() { @Override @@ -106,28 +113,20 @@ public class SingleTaskActivity extends BaseActivity { mStop = findViewById(R.id.stop); mCancel = findViewById(R.id.cancel); mRg = findViewById(R.id.speeds); + mStop.setVisibility(View.GONE); setTitle("单任务下载"); Aria.download(this).register(); - DownloadTarget target = Aria.download(this).load(DOWNLOAD_URL); + target = Aria.download(this).load(DOWNLOAD_URL); getBinding().setProgress(target.getPercent()); if (target.getTaskState() == IEntity.STATE_STOP) { mStart.setText("恢复"); - mStart.setTextColor(getResources().getColor(android.R.color.holo_blue_light)); - setBtState(true); + //mStart.setTextColor(getResources().getColor(android.R.color.holo_blue_light)); } else if (target.isRunning()) { - setBtState(false); + mStart.setText("停止"); } getBinding().setFileSize(target.getConvertFileSize()); } - /** - * 设置start 和 stop 按钮状态 - */ - private void setBtState(boolean state) { - //mStart.setEnabled(state); - //mStop.setEnabled(!state); - } - @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_single_task_activity, menu); @@ -180,7 +179,7 @@ public class SingleTaskActivity extends BaseActivity { @Download.onPre protected void onPre(DownloadTask task) { if (task.getKey().equals(DOWNLOAD_URL)) { - setBtState(false); + mStart.setText("停止"); } } @@ -193,7 +192,7 @@ public class SingleTaskActivity extends BaseActivity { @Download.onTaskRunning protected void running(DownloadTask task) { - ALog.d(TAG, String.format("%s_running_%s", getClass().getName(), hashCode())); + //ALog.d(TAG, String.format("%s_running_%s", getClass().getName(), hashCode())); //if (task.getKey().equals(DOWNLOAD_URL)) { //Log.d(TAG, task.getKey()); long len = task.getFileSize(); @@ -209,8 +208,7 @@ public class SingleTaskActivity extends BaseActivity { @Download.onTaskResume void taskResume(DownloadTask task) { if (task.getKey().equals(DOWNLOAD_URL)) { - mStart.setText("暂停"); - setBtState(false); + mStart.setText("停止"); } } @@ -218,7 +216,6 @@ public class SingleTaskActivity extends BaseActivity { void taskStop(DownloadTask task) { if (task.getKey().equals(DOWNLOAD_URL)) { mStart.setText("恢复"); - setBtState(true); getBinding().setSpeed(""); } } @@ -229,7 +226,6 @@ public class SingleTaskActivity extends BaseActivity { getBinding().setProgress(0); Toast.makeText(SingleTaskActivity.this, "取消下载", Toast.LENGTH_SHORT).show(); mStart.setText("开始"); - setBtState(true); getBinding().setSpeed(""); Log.d(TAG, "cancel"); } @@ -242,24 +238,27 @@ public class SingleTaskActivity extends BaseActivity { void taskFail(DownloadTask task, Exception e) { if (task.getKey().equals(DOWNLOAD_URL)) { Toast.makeText(SingleTaskActivity.this, "下载失败", Toast.LENGTH_SHORT).show(); - setBtState(true); - //Aria.download(this) - // .load(DOWNLOAD_URL) - // .updateUrl("http://120.55.95.61:8811/ghcg/zg/武义总规纲要成果.zip") - // .start(); - //DOWNLOAD_URL = "http://120.55.95.61:8811/ghcg/zg/武义总规纲要成果.zip"; - //ALog.d(TAG, ALog.getExceptionString(e)); + mStart.setText("开始"); } } @Download.onTaskComplete void taskComplete(DownloadTask task) { + //Glide.with(this).load("").asBitmap().transform(new BitmapTransformation() { + // @Override + // protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { + // return null; + // } + // + // @Override public String getId() { + // return null; + // } + //}) //if (task.getKey().equals(DOWNLOAD_URL)) { getBinding().setProgress(100); Toast.makeText(SingleTaskActivity.this, "下载完成", Toast.LENGTH_SHORT).show(); mStart.setText("重新开始?"); //mCancel.setEnabled(false); - setBtState(true); getBinding().setSpeed(""); L.d(TAG, "path = " + task.getDownloadEntity().getDownloadPath()); L.d(TAG, "md5Code = " + CommonUtil.getFileMD5(new File(task.getDownloadPath()))); @@ -290,7 +289,11 @@ public class SingleTaskActivity extends BaseActivity { public void onClick(View view) { switch (view.getId()) { case R.id.start: - startD(); + if (target.isRunning()) { + Aria.download(this).load(DOWNLOAD_URL).stop(); + } else { + startD(); + } break; case R.id.stop: Aria.download(this).load(DOWNLOAD_URL).stop(); @@ -314,7 +317,7 @@ public class SingleTaskActivity extends BaseActivity { //.addHeader("Cookie", "BAIDUID=648E5FF020CC69E8DD6F492D1068AAA9:FG=1; BIDUPSID=648E5FF020CC69E8DD6F492D1068AAA9; PSTM=1519099573; BD_UPN=12314753; locale=zh; BDSVRTM=0") .useServerFileName(true) .setFilePath(path, true) - .setFileLenAdapter(new IHttpFileLenAdapter() { + .setFileLenAdapter(new AbsHttpFileLenAdapter() { @Override public long handleFileLen(Map> headers) { List sLength = headers.get("Content-Length"); diff --git a/app/src/main/java/com/arialyy/simple/core/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/core/download/group/DownloadGroupActivity.java index 3e7bbd1a..549bb020 100644 --- a/app/src/main/java/com/arialyy/simple/core/download/group/DownloadGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/core/download/group/DownloadGroupActivity.java @@ -90,18 +90,18 @@ public class DownloadGroupActivity extends BaseActivity> headers) { - - List sLength = headers.get("Content-Length"); - if (sLength == null || sLength.isEmpty()) { - return -1; - } - String temp = sLength.get(0); - - return Long.parseLong(temp); - } - }) + //.setFileLenAdapter(new AbsHttpFileLenAdapter() { + // @Override public long handleFileLen(Map> headers) { + // + // List sLength = headers.get("Content-Length"); + // if (sLength == null || sLength.isEmpty()) { + // return -1; + // } + // String temp = sLength.get(0); + // + // return Long.parseLong(temp); + // } + //}) //.setFileSize(114981416) //.updateUrls(temp) .start(); @@ -111,17 +111,6 @@ public class DownloadGroupActivity extends BaseActivity