修复网络异常时,过度回调的问题
This commit is contained in:
@@ -27,7 +27,7 @@ import java.util.List;
|
||||
* 1.如果执行队列没有满,则开始下载任务,直到执行队列满
|
||||
* 2.如果队列执行队列已经满了,则将所有任务添加到等待队列中
|
||||
* 3.如果队列中只有等待状态的任务,如果执行队列没有满,则会启动等待状态的任务,如果执行队列已经满了,则会将所有等待状态的任务加载到缓存队列中
|
||||
* 4.恢复下载的任务规则是,停止时间越晚的任务启动越早,安装DESC来进行排序
|
||||
* 4.恢复下载的任务规则是,停止时间越晚的任务启动越早,按照DESC来进行排序
|
||||
*/
|
||||
final class ResumeAllCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
private List<AbsTaskEntity> mWaitList = new ArrayList<>();
|
||||
@@ -96,7 +96,7 @@ final class ResumeAllCmd<T extends AbsTaskEntity> extends AbsNormalCmd<T> {
|
||||
int state = te.getState();
|
||||
if (state == IEntity.STATE_STOP || state == IEntity.STATE_OTHER) {
|
||||
resumeEntity(te);
|
||||
} else if (state == IEntity.STATE_WAIT) {
|
||||
} else if (state == IEntity.STATE_WAIT || state == IEntity.STATE_FAIL) {
|
||||
mWaitList.add(te);
|
||||
} else if (state == IEntity.STATE_RUNNING) {
|
||||
if (!mQueue.taskIsRunning(te.getEntity().getKey())) {
|
||||
|
||||
@@ -535,9 +535,7 @@ public abstract class AbsFileer<ENTITY extends AbsNormalEntity, TASK_ENTITY exte
|
||||
AbsThreadTask task = mTask.get(key);
|
||||
if (task != null && !task.isThreadComplete()) {
|
||||
task.getConfig().START_LOCATION = task.getConfig().THREAD_RECORD.startLocation;
|
||||
mConstance.isStop = false;
|
||||
mConstance.isCancel = false;
|
||||
mConstance.isRunning = true;
|
||||
mConstance.resetState();
|
||||
startTimer();
|
||||
ALog.d(TAG, String.format("任务【%s】开始重试,线程__%s__【开始位置:%s,结束位置:%s】", mEntity.getFileName(),
|
||||
key, task.getConfig().START_LOCATION, task.getConfig().END_LOCATION));
|
||||
|
||||
@@ -245,7 +245,7 @@ public abstract class AbsThreadTask<ENTITY extends AbsNormalEntity, TASK_ENTITY
|
||||
protected void fail(final long subCurrentLocation, String msg, Exception ex, boolean needRetry) {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
if (ex != null) {
|
||||
ALog.e(TAG, msg + "\n" + ALog.getExceptionString(ex));
|
||||
//ALog.e(TAG, msg + "\n" + ALog.getExceptionString(ex));
|
||||
} else {
|
||||
ALog.e(TAG, msg);
|
||||
}
|
||||
@@ -280,7 +280,7 @@ public abstract class AbsThreadTask<ENTITY extends AbsNormalEntity, TASK_ENTITY
|
||||
mFailTimer.schedule(new TimerTask() {
|
||||
@Override public void run() {
|
||||
if (isBreak()) {
|
||||
handleSailState(false);
|
||||
handleFailState(false);
|
||||
return;
|
||||
}
|
||||
mFailTimes++;
|
||||
@@ -292,7 +292,7 @@ public abstract class AbsThreadTask<ENTITY extends AbsNormalEntity, TASK_ENTITY
|
||||
}
|
||||
}, RETRY_INTERVAL);
|
||||
} else {
|
||||
handleSailState(!isBreak());
|
||||
handleFailState(!isBreak());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -301,13 +301,17 @@ public abstract class AbsThreadTask<ENTITY extends AbsNormalEntity, TASK_ENTITY
|
||||
*
|
||||
* @param taskNeedReTry 任务是否需要重试{@code true} 需要
|
||||
*/
|
||||
private void handleSailState(boolean taskNeedReTry) {
|
||||
STATE.FAIL_NUM++;
|
||||
if (STATE.isFail()) {
|
||||
STATE.isRunning = false;
|
||||
STATE.isStop = true;
|
||||
ALog.e(TAG, String.format("任务【%s】执行失败", mConfig.TEMP_FILE.getName()));
|
||||
mListener.onFail(taskNeedReTry);
|
||||
private void handleFailState(boolean taskNeedReTry) {
|
||||
synchronized (AriaManager.LOCK) {
|
||||
STATE.FAIL_NUM++;
|
||||
if (STATE.isFail()) {
|
||||
STATE.isRunning = false;
|
||||
// 手动停止不进行fail回调
|
||||
if (!STATE.isStop) {
|
||||
ALog.e(TAG, String.format("任务【%s】执行失败", mConfig.TEMP_FILE.getName()));
|
||||
mListener.onFail(taskNeedReTry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,17 +15,20 @@
|
||||
*/
|
||||
package com.arialyy.aria.core.common;
|
||||
|
||||
import com.arialyy.aria.util.ALog;
|
||||
|
||||
/**
|
||||
* Created by lyy on 2017/1/18.
|
||||
* 状态常量
|
||||
*/
|
||||
public class StateConstance {
|
||||
private static final String TAG = "StateConstance";
|
||||
public int CANCEL_NUM = 0;
|
||||
public int STOP_NUM = 0;
|
||||
public int FAIL_NUM = 0;
|
||||
public int COMPLETE_THREAD_NUM = 0;
|
||||
public int START_THREAD_NUM; //启动的线程数
|
||||
public long CURRENT_LOCATION = 0;
|
||||
public long CURRENT_LOCATION = 0; //当前下载进度
|
||||
public boolean isRunning = false;
|
||||
public boolean isCancel = false;
|
||||
public boolean isStop = false;
|
||||
@@ -38,7 +41,6 @@ public class StateConstance {
|
||||
isCancel = false;
|
||||
isStop = false;
|
||||
isRunning = true;
|
||||
CURRENT_LOCATION = 0;
|
||||
CANCEL_NUM = 0;
|
||||
STOP_NUM = 0;
|
||||
FAIL_NUM = 0;
|
||||
@@ -55,15 +57,17 @@ public class StateConstance {
|
||||
* 所有子线程是否都已经失败
|
||||
*/
|
||||
public boolean isFail() {
|
||||
ALog.d(TAG, String.format("fail_num=%s; start_thread_num=%s, complete_num=%s", FAIL_NUM,
|
||||
START_THREAD_NUM, COMPLETE_THREAD_NUM));
|
||||
return COMPLETE_THREAD_NUM != START_THREAD_NUM
|
||||
&& FAIL_NUM + COMPLETE_THREAD_NUM >= START_THREAD_NUM;
|
||||
&& FAIL_NUM == START_THREAD_NUM;
|
||||
}
|
||||
|
||||
/**
|
||||
* 所有子线程是否都已经完成
|
||||
*/
|
||||
public boolean isComplete() {
|
||||
return COMPLETE_THREAD_NUM >= START_THREAD_NUM;
|
||||
return COMPLETE_THREAD_NUM == START_THREAD_NUM;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -174,7 +174,8 @@ class BaseDListener<ENTITY extends AbsEntity, TASK_ENTITY extends AbsTaskEntity<
|
||||
} else if (mEntity.isComplete()) {
|
||||
mEntity.setCompleteTime(System.currentTimeMillis());
|
||||
mEntity.setCurrentProgress(mEntity.getFileSize());
|
||||
} else if (location > 0) {
|
||||
}
|
||||
if (location > 0) {
|
||||
mEntity.setCurrentProgress(location);
|
||||
}
|
||||
mTaskEntity.update();
|
||||
|
||||
@@ -262,9 +262,8 @@ public abstract class AbsGroupUtil implements IUtil {
|
||||
dt.stop();
|
||||
}
|
||||
}
|
||||
if (mDownloaderMap.size() == 0) {
|
||||
mListener.onStop(mCurrentLocation);
|
||||
}
|
||||
clearState();
|
||||
mListener.onStop(mCurrentLocation);
|
||||
}
|
||||
|
||||
protected void onStop() {
|
||||
@@ -279,7 +278,7 @@ public abstract class AbsGroupUtil implements IUtil {
|
||||
mListener.onPre();
|
||||
mGroupSize = mGTEntity.getSubTaskEntities().size();
|
||||
mTotalLen = mGTEntity.getEntity().getFileSize();
|
||||
isNeedLoadFileSize = mTotalLen <= 1;
|
||||
isNeedLoadFileSize = mTotalLen <= 10;
|
||||
for (DownloadTaskEntity te : mGTEntity.getSubTaskEntities()) {
|
||||
File file = new File(te.getKey());
|
||||
if (te.getState() == IEntity.STATE_COMPLETE && file.exists()) {
|
||||
@@ -455,7 +454,7 @@ public abstract class AbsGroupUtil implements IUtil {
|
||||
mListener.onSubStop(subEntity);
|
||||
synchronized (AbsGroupUtil.LOCK) {
|
||||
mStopNum++;
|
||||
if (mStopNum + mCompleteNum + mFailMap.size() == mGroupSize) {
|
||||
if (mStopNum + mCompleteNum + mFailMap.size() == mGroupSize && !isStop) {
|
||||
closeTimer(false);
|
||||
mListener.onStop(mCurrentLocation);
|
||||
}
|
||||
@@ -479,7 +478,9 @@ public abstract class AbsGroupUtil implements IUtil {
|
||||
if (mCompleteNum == mGroupSize) {
|
||||
closeTimer(false);
|
||||
mListener.onComplete();
|
||||
} else if (mFailMap.size() > 0 && mStopNum + mCompleteNum + mFailMap.size() >= mGroupSize) {
|
||||
} else if (mFailMap.size() > 0
|
||||
&& mStopNum + mCompleteNum + mFailMap.size() >= mGroupSize
|
||||
&& !isStop) {
|
||||
//如果子任务完成数量加上失败的数量和总任务数一致,则任务组停止下载
|
||||
closeTimer(false);
|
||||
mListener.onStop(mCurrentLocation);
|
||||
@@ -500,10 +501,10 @@ public abstract class AbsGroupUtil implements IUtil {
|
||||
private void reTry(boolean needRetry) {
|
||||
Downloader dt = mDownloaderMap.get(subEntity.getUrl());
|
||||
synchronized (AbsGroupUtil.LOCK) {
|
||||
if (dt != null
|
||||
if (!isCancel && !isStop && dt != null
|
||||
&& !dt.isBreak()
|
||||
&& needRetry
|
||||
&& subEntity.getFailNum() < 5
|
||||
&& subEntity.getFailNum() < 3
|
||||
&& (NetUtils.isConnected(AriaManager.APP) || isNotNetRetry)) {
|
||||
reStartTask(dt);
|
||||
} else {
|
||||
@@ -533,7 +534,7 @@ public abstract class AbsGroupUtil implements IUtil {
|
||||
dt.retryThreadTask();
|
||||
}
|
||||
}
|
||||
}, 3000);
|
||||
}, 5000);
|
||||
}
|
||||
|
||||
private void handleSpeed(long speed) {
|
||||
|
||||
@@ -101,12 +101,8 @@ class FtpThreadTask extends AbsFtpThreadTask<DownloadEntity, DownloadTaskEntity>
|
||||
readDynamicFile(is);
|
||||
} else {
|
||||
readNormal(is);
|
||||
handleComplete();
|
||||
}
|
||||
|
||||
if (isBreak()) {
|
||||
return;
|
||||
}
|
||||
handleComplete();
|
||||
} catch (IOException e) {
|
||||
fail(mChildCurrentLocation, String.format("下载失败【%s】", mConfig.URL), e);
|
||||
} catch (Exception e) {
|
||||
@@ -129,6 +125,9 @@ class FtpThreadTask extends AbsFtpThreadTask<DownloadEntity, DownloadTaskEntity>
|
||||
* 处理线程完成的情况
|
||||
*/
|
||||
private void handleComplete() {
|
||||
if (isBreak()) {
|
||||
return;
|
||||
}
|
||||
ALog.i(TAG,
|
||||
String.format("任务【%s】线程__%s__下载完毕", mConfig.TEMP_FILE.getName(), mConfig.THREAD_ID));
|
||||
writeConfig(true, mConfig.END_LOCATION);
|
||||
@@ -178,6 +177,7 @@ class FtpThreadTask extends AbsFtpThreadTask<DownloadEntity, DownloadTaskEntity>
|
||||
bf.compact();
|
||||
progress(len);
|
||||
}
|
||||
handleComplete();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
|
||||
@@ -99,12 +99,8 @@ final class HttpThreadTask extends AbsThreadTask<DownloadEntity, DownloadTaskEnt
|
||||
} else {
|
||||
readNormal(is, file);
|
||||
}
|
||||
handleComplete();
|
||||
}
|
||||
|
||||
if (isBreak()) {
|
||||
return;
|
||||
}
|
||||
handleComplete();
|
||||
} catch (MalformedURLException e) {
|
||||
fail(mChildCurrentLocation, "下载链接异常", e);
|
||||
} catch (IOException e) {
|
||||
@@ -153,6 +149,7 @@ final class HttpThreadTask extends AbsThreadTask<DownloadEntity, DownloadTaskEnt
|
||||
bf.compact();
|
||||
progress(len);
|
||||
}
|
||||
handleComplete();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
@@ -207,29 +204,28 @@ final class HttpThreadTask extends AbsThreadTask<DownloadEntity, DownloadTaskEnt
|
||||
* 处理完成配置文件的更新或事件回调
|
||||
*/
|
||||
private void handleComplete() {
|
||||
if (isBreak()) {
|
||||
return;
|
||||
}
|
||||
//支持断点的处理
|
||||
if (mConfig.SUPPORT_BP) {
|
||||
if (mChildCurrentLocation == mConfig.END_LOCATION) {
|
||||
ALog.i(TAG,
|
||||
String.format("任务【%s】线程__%s__下载完毕", mConfig.TEMP_FILE.getName(), mConfig.THREAD_ID));
|
||||
writeConfig(true, mConfig.END_LOCATION);
|
||||
STATE.COMPLETE_THREAD_NUM++;
|
||||
if (STATE.isComplete()) {
|
||||
if (isBlock) {
|
||||
boolean success = mergeFile();
|
||||
if (!success) {
|
||||
ALog.e(TAG, String.format("任务【%s】分块文件合并失败", mConfig.TEMP_FILE.getName()));
|
||||
STATE.isRunning = false;
|
||||
mListener.onFail(false);
|
||||
return;
|
||||
}
|
||||
ALog.i(TAG,
|
||||
String.format("任务【%s】线程__%s__下载完毕", mConfig.TEMP_FILE.getName(), mConfig.THREAD_ID));
|
||||
writeConfig(true, mConfig.END_LOCATION);
|
||||
STATE.COMPLETE_THREAD_NUM++;
|
||||
if (STATE.isComplete()) {
|
||||
if (isBlock) {
|
||||
boolean success = mergeFile();
|
||||
if (!success) {
|
||||
ALog.e(TAG, String.format("任务【%s】分块文件合并失败", mConfig.TEMP_FILE.getName()));
|
||||
STATE.isRunning = false;
|
||||
mListener.onFail(false);
|
||||
return;
|
||||
}
|
||||
STATE.TASK_RECORD.deleteData();
|
||||
STATE.isRunning = false;
|
||||
mListener.onComplete();
|
||||
}
|
||||
} else {
|
||||
STATE.FAIL_NUM++;
|
||||
STATE.TASK_RECORD.deleteData();
|
||||
STATE.isRunning = false;
|
||||
mListener.onComplete();
|
||||
}
|
||||
if (STATE.isFail()) {
|
||||
STATE.isRunning = false;
|
||||
|
||||
@@ -67,16 +67,10 @@ abstract class AbsTaskQueue<TASK extends AbsTask, TASK_ENTITY extends AbsTaskEnt
|
||||
* 停止所有任务
|
||||
*/
|
||||
@Override public void stopAllTask() {
|
||||
//for(String key : mCachePool.getAllTask().keySet()){
|
||||
// TASK task = mCachePool.getAllTask().get(key);
|
||||
// if (task != null){
|
||||
// task.stop();
|
||||
// }
|
||||
//}
|
||||
mCachePool.clear();
|
||||
for (String key : mExecutePool.getAllTask().keySet()) {
|
||||
TASK task = mExecutePool.getAllTask().get(key);
|
||||
if (task != null && task.isRunning()) {
|
||||
if (task != null && (task.isRunning() || task.getState() == IEntity.STATE_FAIL)) {
|
||||
task.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,11 +168,13 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, TASK extends Abs
|
||||
case CANCEL:
|
||||
mQueue.removeTaskFormQueue(task.getKey());
|
||||
if (mQueue.getCurrentExePoolNum() < mQueue.getMaxTaskNum()) {
|
||||
ALog.d(TAG, "stop_next");
|
||||
startNextTask();
|
||||
}
|
||||
break;
|
||||
case COMPLETE:
|
||||
mQueue.removeTaskFormQueue(task.getKey());
|
||||
ALog.d(TAG, "complete_next");
|
||||
startNextTask();
|
||||
break;
|
||||
case FAIL:
|
||||
@@ -258,6 +260,7 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, TASK extends Abs
|
||||
private void handleFailTask(final TASK task) {
|
||||
if (!task.needRetry || task.isStop() || task.isCancel()) {
|
||||
mQueue.removeTaskFormQueue(task.getKey());
|
||||
ALog.d(TAG, "fail_next");
|
||||
startNextTask();
|
||||
return;
|
||||
}
|
||||
@@ -281,6 +284,7 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, TASK extends Abs
|
||||
callback(FAIL, task);
|
||||
mQueue.removeTaskFormQueue(task.getKey());
|
||||
startNextTask();
|
||||
ALog.d(TAG, "retry_next");
|
||||
TEManager.getInstance().removeTEntity(task.getKey());
|
||||
return;
|
||||
}
|
||||
@@ -299,6 +303,7 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, TASK extends Abs
|
||||
} else {
|
||||
mQueue.removeTaskFormQueue(task.getKey());
|
||||
startNextTask();
|
||||
ALog.d(TAG, "retry_next_1");
|
||||
TEManager.getInstance().removeTEntity(task.getKey());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ public class ConnectionChangeReceiver extends BroadcastReceiver {
|
||||
private static final String TAG = ConnectionChangeReceiver.class.getSimpleName();
|
||||
|
||||
@Override public void onReceive(Context context, Intent intent) {
|
||||
Log.d(TAG, "网络状态改变");
|
||||
|
||||
/**
|
||||
* 获得网络连接服务
|
||||
*/
|
||||
@@ -23,11 +23,12 @@ public class ConnectionChangeReceiver extends BroadcastReceiver {
|
||||
|
||||
if (NetworkInfo.State.CONNECTED == state) {
|
||||
Aria.download(this).resumeAllTask();
|
||||
Log.w(TAG, "恢复所有任务");
|
||||
return;
|
||||
}
|
||||
|
||||
Aria.download(this).stopAllTask();
|
||||
|
||||
//Log.w(TAG, "停止所有任务");
|
||||
//state = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
|
||||
//if (NetworkInfo.State.CONNECTED == state) {
|
||||
//
|
||||
|
||||
@@ -70,15 +70,15 @@ final class FileListAdapter extends AbsRVAdapter<FileListEntity, FileListAdapter
|
||||
Toast.makeText(getContext(), "开始下载:" + item.name, Toast.LENGTH_SHORT).show();
|
||||
if (item.isGroup) {
|
||||
Aria.download(getContext())
|
||||
.load(Arrays.asList(item.urls))
|
||||
.loadGroup(Arrays.asList(item.urls))
|
||||
.setSubFileName(Arrays.asList(item.names))
|
||||
.setDownloadDirPath(item.downloadPath)
|
||||
.setDirPath(item.downloadPath)
|
||||
.setGroupAlias(item.name)
|
||||
.start();
|
||||
} else {
|
||||
Aria.download(getContext())
|
||||
.load(item.key)
|
||||
.setDownloadPath(item.downloadPath)
|
||||
.setFilePath(item.downloadPath)
|
||||
.start();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,6 +144,7 @@ public class MultiDownloadActivity extends BaseActivity<ActivityMultiDownloadBin
|
||||
}
|
||||
|
||||
@DownloadGroup.onTaskRunning() void groupTaskRunning(DownloadGroupTask task) {
|
||||
ALog.d(TAG, String.format("group【%s】running", task.getTaskName()));
|
||||
mAdapter.setProgress(task.getEntity());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user