修复网络异常时,过度回调的问题

This commit is contained in:
laoyuyu
2018-06-25 21:16:38 +08:00
parent ebe0173074
commit b2f1141247
13 changed files with 75 additions and 70 deletions

View File

@@ -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())) {

View File

@@ -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));

View File

@@ -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);
}
}
}
}

View File

@@ -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;
}
/**

View File

@@ -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();

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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();
}
}

View File

@@ -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());
}
}

View File

@@ -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) {
//

View File

@@ -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();
}
}

View File

@@ -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());
}