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