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 db24b141..74f7eb8c 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 @@ -130,7 +130,7 @@ public abstract class AbsFileer<ENTITY extends AbsNormalEntity, TASK_ENTITY exte }, 0, 1000); } - private void closeTimer() { + protected void closeTimer() { if (mTimer != null) { mTimer.purge(); mTimer.cancel(); @@ -389,10 +389,4 @@ public abstract class AbsFileer<ENTITY extends AbsNormalEntity, TASK_ENTITY exte */ protected abstract AbsThreadTask selectThreadTask(SubThreadConfig<TASK_ENTITY> config); - protected void failDownload(String errorMsg) { - closeTimer(); - Log.e(TAG, errorMsg); - mConstance.isRunning = false; - mListener.onFail(); - } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java index 316d6cbc..e6d4ba6c 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java +++ b/Aria/src/main/java/com/arialyy/aria/core/common/AbsThreadTask.java @@ -28,6 +28,8 @@ import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.util.Properties; +import java.util.Timer; +import java.util.TimerTask; /** * Created by lyy on 2017/1/18. @@ -35,6 +37,14 @@ import java.util.Properties; */ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskEntity<ENTITY>> implements Runnable { + /** + * 线程重试次数 + */ + private final int RETRY_NUM = 5; + /** + * 线程重试间隔 + */ + private final int RETRY_INTERVAL = 5000; private final String TAG = "AbsThreadTask"; protected long mChildCurrentLocation = 0, mSleepTime = 0; protected int mBufSize; @@ -48,6 +58,8 @@ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extend * FTP 服务器编码 */ public static String SERVER_CHARSET = "ISO-8859-1"; + private int mFailNum = 0; + private Timer mFailTimer; protected AbsThreadTask(StateConstance constance, IEventListener listener, SubThreadConfig<TASK_ENTITY> info) { @@ -168,11 +180,11 @@ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extend writeConfig(false, currentLocation); if (STATE.isFail()) { Log.e(TAG, "任务【" + mConfig.TEMP_FILE.getName() + "】执行失败"); - mListener.onFail(); + mListener.onFail(true); } } else { Log.e(TAG, "任务【" + mConfig.TEMP_FILE.getName() + "】执行失败"); - mListener.onFail(); + mListener.onFail(true); } } catch (IOException e) { e.printStackTrace(); @@ -180,6 +192,24 @@ public abstract class AbsThreadTask<ENTITY extends AbsEntity, TASK_ENTITY extend } } + /** + * 重试当前线程 + */ + private void retryThis(boolean needRetry) { + if (mFailNum < RETRY_NUM && needRetry) { + if (mFailTimer != null){ + mFailTimer.purge(); + mFailTimer.cancel(); + } + mFailTimer = new Timer(); + mFailTimer.schedule(new TimerTask() { + @Override public void run() { + AbsThreadTask.this.run(); + } + }, RETRY_INTERVAL); + } + } + /** * 将记录写入到配置文件 */ diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/BaseDListener.java b/Aria/src/main/java/com/arialyy/aria/core/download/BaseDListener.java index df94306f..dd0ba87d 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/BaseDListener.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/BaseDListener.java @@ -16,13 +16,11 @@ package com.arialyy.aria.core.download; import android.os.Handler; -import android.util.Log; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.inf.AbsEntity; import com.arialyy.aria.core.inf.AbsTask; import com.arialyy.aria.core.inf.IDownloadListener; import com.arialyy.aria.core.inf.IEntity; -import com.arialyy.aria.core.inf.IEventListener; import com.arialyy.aria.core.scheduler.ISchedulers; import com.arialyy.aria.util.CommonUtil; import java.lang.ref.WeakReference; @@ -105,10 +103,11 @@ class BaseDListener<ENTITY extends AbsEntity, TASK extends AbsTask<ENTITY>> sendInState2Target(ISchedulers.COMPLETE); } - @Override public void onFail() { + @Override public void onFail(boolean needRetry) { mEntity.setFailNum(mEntity.getFailNum() + 1); saveData(IEntity.STATE_FAIL, mEntity.getCurrentProgress()); handleSpeed(0); + mTask.needRetry = needRetry; sendInState2Target(ISchedulers.FAIL); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java index 5c698a12..f91f4fc9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/AbsGroupUtil.java @@ -103,7 +103,7 @@ abstract class AbsGroupUtil implements IUtil { mCurrentLocation += entity.getFileSize(); } else { mExeMap.put(entity.getUrl(), createChildDownloadTask(entity)); - mCurrentLocation += entity.getCurrentProgress(); + mCurrentLocation += file.exists() ? entity.getCurrentProgress() : 0; mActualTaskNum++; } mTotalSize += entity.getFileSize(); @@ -339,19 +339,19 @@ abstract class AbsGroupUtil implements IUtil { } } - @Override public void onFail() { + @Override public void onFail(boolean needRetry) { entity.setFailNum(entity.getFailNum() + 1); saveData(IEntity.STATE_FAIL, lastLen); handleSpeed(0); - reTry(); + reTry(needRetry); } /** * 失败后重试下载,如果失败次数超过5次,不再重试 */ - private void reTry() { + private void reTry(boolean needRetry) { synchronized (AriaManager.LOCK) { - if (entity.getFailNum() < 5 && isRunning) { + if (entity.getFailNum() < 5 && isRunning && needRetry) { reStartTask(); } else { mFailNum++; 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 241b324b..616a86b7 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 @@ -15,6 +15,7 @@ */ package com.arialyy.aria.core.download.downloader; +import android.util.Log; import com.arialyy.aria.core.AriaManager; import com.arialyy.aria.core.common.AbsFileer; import com.arialyy.aria.core.common.AbsThreadTask; @@ -34,6 +35,7 @@ import java.io.IOException; * 文件下载器 */ class Downloader extends AbsFileer<DownloadEntity, DownloadTaskEntity> { + private String TAG = "Downloader"; Downloader(IDownloadListener listener, DownloadTaskEntity taskEntity) { super(listener, taskEntity); @@ -100,4 +102,12 @@ class Downloader extends AbsFileer<DownloadEntity, DownloadTaskEntity> { } return null; } + + + private void failDownload(String errorMsg) { + closeTimer(); + Log.e(TAG, errorMsg); + mConstance.isRunning = false; + mListener.onFail(false); + } } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirDownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirDownloadUtil.java index 9c5c7ce8..f8c97c13 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirDownloadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/FtpDirDownloadUtil.java @@ -47,7 +47,7 @@ public class FtpDirDownloadUtil extends AbsGroupUtil { } @Override public void onFail(String url, String errorMsg) { - mListener.onFail(); + mListener.onFail(true); } }).start(); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java index a124bb27..c800f2b0 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java +++ b/Aria/src/main/java/com/arialyy/aria/core/download/downloader/SimpleDownloadUtil.java @@ -82,7 +82,7 @@ public class SimpleDownloadUtil implements IUtil, Runnable { } private void failDownload(String msg) { - mListener.onFail(); + mListener.onFail(true); } @Override public void run() { 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 1bbaecc8..5501f695 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 @@ -23,7 +23,10 @@ import com.arialyy.aria.util.CommonUtil; * Created by AriaL on 2017/6/29. */ public abstract class AbsTask<ENTITY extends AbsEntity> implements ITask<ENTITY> { - + /** + * 是否需要重试,默认为true + */ + public boolean needRetry = true; protected ENTITY mEntity; protected Handler mOutHandler; diff --git a/Aria/src/main/java/com/arialyy/aria/core/inf/IEventListener.java b/Aria/src/main/java/com/arialyy/aria/core/inf/IEventListener.java index edce5282..11da04c7 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/inf/IEventListener.java +++ b/Aria/src/main/java/com/arialyy/aria/core/inf/IEventListener.java @@ -58,6 +58,8 @@ public interface IEventListener { /** * 下载失败 + * @param needRetry 是否需要重试{@code true} 需要 */ - void onFail(); + void onFail(boolean needRetry); + } diff --git a/Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulers.java b/Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulers.java index 8e40eacb..281324c9 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulers.java +++ b/Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulers.java @@ -225,6 +225,11 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY extends A * @param task 下载任务 */ private void handleFailTask(final TASK task) { + if (!task.needRetry) { + mQueue.removeTask(task.getEntity()); + startNextTask(); + return; + } long interval = 2000; int num = 10; if (task instanceof DownloadTask) { diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseUListener.java b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseUListener.java index 299726e4..4ec59630 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/BaseUListener.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/BaseUListener.java @@ -92,10 +92,11 @@ class BaseUListener<ENTITY extends AbsEntity, TASK extends AbsTask<ENTITY>> sendInState2Target(ISchedulers.COMPLETE); } - @Override public void onFail() { + @Override public void onFail(boolean needRetry) { mEntity.setFailNum(mEntity.getFailNum() + 1); saveData(IEntity.STATE_FAIL, mEntity.getCurrentProgress()); handleSpeed(0); + mTask.needRetry = needRetry; sendInState2Target(ISchedulers.FAIL); } diff --git a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadListener.java b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadListener.java index bf43c7bd..17506e92 100644 --- a/Aria/src/main/java/com/arialyy/aria/core/upload/UploadListener.java +++ b/Aria/src/main/java/com/arialyy/aria/core/upload/UploadListener.java @@ -49,7 +49,7 @@ class UploadListener implements IUploadListener { } - @Override public void onFail() { + @Override public void onFail(boolean needRetry) { } } 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 f32a8d69..cca591fa 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 @@ -98,7 +98,7 @@ class HttpThreadTask extends AbsThreadTask<UploadEntity, UploadTaskEntity> { private void fail() { try { - mListener.onFail(); + mListener.onFail(true); STATE.isRunning = false; if (mOutputStream != null) { mOutputStream.close(); diff --git a/README.md b/README.md index 399d90b4..9ca1f4b0 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,8 @@ Aria有以下特点: [](https://bintray.com/arialyy/maven/AriaApi/_latestVersion) [](https://bintray.com/arialyy/maven/AriaCompiler/_latestVersion) ```java -compile 'com.arialyy.aria:aria-core:3.2.19' -annotationProcessor 'com.arialyy.aria:aria-compiler:3.2.19' +compile 'com.arialyy.aria:aria-core:3.2.20' +annotationProcessor 'com.arialyy.aria:aria-compiler:3.2.20' ``` ## 示例 diff --git a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java index e1c6bcfb..cc10cb35 100644 --- a/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java +++ b/app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java @@ -81,15 +81,7 @@ public class DownloadGroupActivity extends BaseActivity<ActivityDownloadGroupBin Aria.download(this).load(mUrls).stop(); break; case R.id.cancel: - //Aria.download(this).load(mUrls).cancel(); - Aria.download(this).removeAllTask(true); - - new Handler().postDelayed(new Runnable() { - @Override public void run() { - L.d(TAG, - "size ==> " + Aria.download(DownloadGroupActivity.this).getTotleTaskList().size()); - } - }, 1000); + Aria.download(this).load(mUrls).cancel(); break; } } @@ -114,6 +106,7 @@ public class DownloadGroupActivity extends BaseActivity<ActivityDownloadGroupBin } @DownloadGroup.onTaskRunning() protected void running(DownloadGroupTask task) { + L.d(TAG, "P ==> " + task.getPercent()); getBinding().setProgress(task.getPercent()); getBinding().setSpeed(task.getConvertSpeed()); mChildList.updateChildProgress(task.getEntity().getSubTask()); diff --git a/build.gradle b/build.gradle index 2b6a3686..70aa0750 100644 --- a/build.gradle +++ b/build.gradle @@ -37,7 +37,7 @@ task clean(type: Delete) { ext { userOrg = 'arialyy' groupId = 'com.arialyy.aria' - publishVersion = '3.2.19' + publishVersion = '3.2.20' repoName='maven' desc = 'android 下载框架' website = 'https://github.com/AriaLyy/Aria'