fix bug https://github.com/AriaLyy/Aria/issues/505 增加上传任务强制上传的功能pull/617/head
parent
5ad485890c
commit
846e6c0720
@ -0,0 +1,198 @@ |
||||
/* |
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package com.arialyy.aria.core.command; |
||||
|
||||
import android.text.TextUtils; |
||||
import com.arialyy.aria.core.common.AbsEntity; |
||||
import com.arialyy.aria.core.download.DGTaskWrapper; |
||||
import com.arialyy.aria.core.download.DTaskWrapper; |
||||
import com.arialyy.aria.core.download.DownloadEntity; |
||||
import com.arialyy.aria.core.download.DownloadGroupEntity; |
||||
import com.arialyy.aria.core.inf.IEntity; |
||||
import com.arialyy.aria.core.inf.IOptionConstant; |
||||
import com.arialyy.aria.core.listener.ISchedulers; |
||||
import com.arialyy.aria.core.manager.TaskWrapperManager; |
||||
import com.arialyy.aria.core.queue.AbsTaskQueue; |
||||
import com.arialyy.aria.core.queue.DGroupTaskQueue; |
||||
import com.arialyy.aria.core.queue.DTaskQueue; |
||||
import com.arialyy.aria.core.queue.UTaskQueue; |
||||
import com.arialyy.aria.core.task.AbsTask; |
||||
import com.arialyy.aria.core.upload.UTaskWrapper; |
||||
import com.arialyy.aria.core.upload.UploadEntity; |
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; |
||||
import com.arialyy.aria.core.wrapper.ITaskWrapper; |
||||
import com.arialyy.aria.orm.DbEntity; |
||||
import com.arialyy.aria.util.ALog; |
||||
import com.arialyy.aria.util.CommonUtil; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 恢复任务工具 |
||||
*/ |
||||
public class ResumeThread implements Runnable { |
||||
private String TAG = CommonUtil.getClassName(getClass()); |
||||
private List<AbsTaskWrapper> mWaitList = new ArrayList<>(); |
||||
private boolean isDownloadCmd; |
||||
private int excludeState; |
||||
|
||||
ResumeThread(boolean isDownload, int excludeState) { |
||||
this.isDownloadCmd = isDownload; |
||||
this.excludeState = excludeState; |
||||
} |
||||
|
||||
/** |
||||
* 查找数据库中的所有任务数据 |
||||
* |
||||
* @param type {@code 1}单任务下载任务;{@code 2}任务组下载任务;{@code 3} 单任务上传任务 |
||||
*/ |
||||
private void findTaskData(int type) { |
||||
if (type == 1) { |
||||
List<DownloadEntity> entities = |
||||
DbEntity.findDatas(DownloadEntity.class, |
||||
"isGroupChild=? AND state!=? ORDER BY stopTime DESC", "false", |
||||
String.valueOf(excludeState)); |
||||
if (entities != null && !entities.isEmpty()) { |
||||
for (DownloadEntity entity : entities) { |
||||
addResumeEntity(TaskWrapperManager.getInstance() |
||||
.getNormalTaskWrapper(DTaskWrapper.class, entity.getId())); |
||||
} |
||||
} |
||||
} else if (type == 2) { |
||||
List<DownloadGroupEntity> entities = |
||||
DbEntity.findDatas(DownloadGroupEntity.class, "state!=? ORDER BY stopTime DESC", |
||||
String.valueOf(excludeState)); |
||||
if (entities != null && !entities.isEmpty()) { |
||||
for (DownloadGroupEntity entity : entities) { |
||||
addResumeEntity( |
||||
TaskWrapperManager.getInstance() |
||||
.getGroupWrapper(DGTaskWrapper.class, entity.getId())); |
||||
} |
||||
} |
||||
} else if (type == 3) { |
||||
List<UploadEntity> entities = |
||||
DbEntity.findDatas(UploadEntity.class, "state!=? ORDER BY stopTime DESC", |
||||
String.valueOf(excludeState)); |
||||
if (entities != null && !entities.isEmpty()) { |
||||
for (UploadEntity entity : entities) { |
||||
addResumeEntity(TaskWrapperManager.getInstance() |
||||
.getNormalTaskWrapper(UTaskWrapper.class, entity.getId())); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 添加恢复实体 |
||||
*/ |
||||
private void addResumeEntity(AbsTaskWrapper te) { |
||||
if (te == null || te.getEntity() == null || TextUtils.isEmpty(te.getKey())) { |
||||
return; |
||||
} |
||||
mWaitList.add(te); |
||||
} |
||||
|
||||
/** |
||||
* 处理等待状态的任务 |
||||
*/ |
||||
private void resumeWaitTask() { |
||||
|
||||
if (mWaitList == null || mWaitList.isEmpty()) { |
||||
return; |
||||
} |
||||
List<AbsEntity> resumeEntities = new ArrayList<>(); |
||||
|
||||
for (AbsTaskWrapper wrapper : mWaitList) { |
||||
AbsTaskQueue queue = null; |
||||
if (wrapper instanceof DTaskWrapper) { |
||||
queue = DTaskQueue.getInstance(); |
||||
} else if (wrapper instanceof UTaskWrapper) { |
||||
queue = UTaskQueue.getInstance(); |
||||
} else if (wrapper instanceof DGTaskWrapper) { |
||||
queue = DGroupTaskQueue.getInstance(); |
||||
} |
||||
|
||||
if (queue == null){ |
||||
ALog.e(TAG, "任务类型错误"); |
||||
continue; |
||||
} |
||||
|
||||
if (wrapper.getEntity() == null || TextUtils.isEmpty(wrapper.getKey())) { |
||||
ALog.e(TAG, "任务实体为空或key为空"); |
||||
continue; |
||||
} |
||||
|
||||
AbsTask task = queue.getTask(wrapper.getKey()); |
||||
if (task != null) { |
||||
ALog.w(TAG, "任务已存在"); |
||||
continue; |
||||
} |
||||
|
||||
int maxTaskNum = queue.getMaxTaskNum(); |
||||
task = queue.createTask(wrapper); |
||||
if (task == null) { |
||||
continue; |
||||
} |
||||
|
||||
handleWrapper(wrapper); |
||||
|
||||
if (queue.getCurrentExePoolNum() < maxTaskNum) { |
||||
queue.startTask(task); |
||||
} else { |
||||
wrapper.getEntity().setState(IEntity.STATE_WAIT); |
||||
sendWaitState(task); |
||||
resumeEntities.add(wrapper.getEntity()); |
||||
} |
||||
} |
||||
if (!resumeEntities.isEmpty()) { |
||||
DbEntity.updateManyData(resumeEntities); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 处理ftp的wrapper |
||||
*/ |
||||
private void handleWrapper(AbsTaskWrapper wrapper) { |
||||
int requestType = wrapper.getRequestType(); |
||||
if (requestType == ITaskWrapper.D_FTP |
||||
|| requestType == ITaskWrapper.U_FTP |
||||
|| requestType == ITaskWrapper.D_FTP_DIR) { |
||||
wrapper.getOptionParams() |
||||
.setParams(IOptionConstant.ftpUrlEntity, |
||||
CommonUtil.getFtpUrlInfo(wrapper.getEntity().getKey())); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 发送等待状态 |
||||
*/ |
||||
private void sendWaitState(AbsTask task) { |
||||
if (task != null) { |
||||
task.getTaskWrapper().setState(IEntity.STATE_WAIT); |
||||
task.getOutHandler().obtainMessage(ISchedulers.WAIT, task).sendToTarget(); |
||||
} |
||||
} |
||||
|
||||
@Override public void run() { |
||||
if (isDownloadCmd) { |
||||
findTaskData(1); |
||||
findTaskData(2); |
||||
} else { |
||||
findTaskData(3); |
||||
} |
||||
resumeWaitTask(); |
||||
} |
||||
} |
Loading…
Reference in new issue