Subtask Status Handling

v4
laoyuyu 2 years ago
parent 69f10d68d1
commit 6b8c051b30
  1. 17
      Http/src/main/java/com/arialyy/aria/http/download/HttpDEventListener.kt
  2. 41
      HttpGroup/src/main/java/com/arialyy/dua/group/HttpSubBlockManager.kt
  3. 4
      PublicComponent/src/main/java/com/arialyy/aria/core/listener/AbsEventListener.java
  4. 24
      PublicComponent/src/main/java/com/arialyy/aria/core/task/TaskCachePool.kt
  5. 25
      PublicComponent/src/main/java/com/arialyy/aria/util/BlockUtil.kt

@ -49,22 +49,9 @@ class HttpDEventListener(task: SingleDownloadTask) : AbsEventListener(task) {
saveData(IEntity.STATE_COMPLETE, task.taskState.fileSize) saveData(IEntity.STATE_COMPLETE, task.taskState.fileSize)
} }
/**
* 1.remove all block
* 2.remove record
*/
override fun handleCancel() {
val file = FileUri.getPathByUri(task.taskState.taskRecord.filePath)?.let { File(it) }
file?.parentFile?.let {
FileUtils.deleteDir(it)
}
DuaContext.duaScope.launch(Dispatchers.IO) { override fun handleCancel() {
val entity = TaskCachePool.getEntity(taskId = task.taskId) BlockUtil.removeTaskBlock(task)
val db = DuaContext.getServiceManager().getDbService().getDuaDb()
db.getRecordDao().deleteTaskRecord(task.taskState.taskRecord)
db.getDEntityDao().delete(entity as DEntity)
}
} }
} }

@ -18,10 +18,16 @@ package com.arialyy.dua.group
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import com.arialyy.aria.core.inf.IBlockManager import com.arialyy.aria.core.inf.IBlockManager
import com.arialyy.aria.core.inf.IEntity
import com.arialyy.aria.core.inf.ITaskManager import com.arialyy.aria.core.inf.ITaskManager
import com.arialyy.aria.core.task.ITask import com.arialyy.aria.core.task.ITask
import com.arialyy.aria.core.task.TaskCachePool.removeTask
import com.arialyy.aria.core.task.TaskCachePool.updateState
import com.arialyy.aria.core.task.TaskState
import com.arialyy.aria.exception.AriaException
import com.arialyy.aria.http.HttpTaskOption import com.arialyy.aria.http.HttpTaskOption
import com.arialyy.aria.http.download.HttpDOptionAdapter import com.arialyy.aria.http.download.HttpDOptionAdapter
import com.arialyy.aria.util.BlockUtil
import timber.log.Timber import timber.log.Timber
/** /**
@ -36,6 +42,7 @@ internal class HttpSubBlockManager(private val task: ITask, private val groupHan
private var isStop = false private var isStop = false
private var isCancel = false private var isCancel = false
private var progress: Long = 0L
/** /**
* Pass the message to the group task after the subtask is stopped * Pass the message to the group task after the subtask is stopped
@ -44,22 +51,55 @@ internal class HttpSubBlockManager(private val task: ITask, private val groupHan
when (msg.what) { when (msg.what) {
ITaskManager.STATE_STOP -> { ITaskManager.STATE_STOP -> {
isStop = true isStop = true
saveData(IEntity.STATE_STOP)
quitLooper()
} }
ITaskManager.STATE_CANCEL -> { ITaskManager.STATE_CANCEL -> {
isCancel = true isCancel = true
removeTask(task)
BlockUtil.removeTaskBlock(task)
quitLooper()
} }
ITaskManager.STATE_FAIL -> { ITaskManager.STATE_FAIL -> {
} }
ITaskManager.STATE_COMPLETE -> { ITaskManager.STATE_COMPLETE -> {
saveData(IEntity.STATE_COMPLETE)
val b = BlockUtil.mergeFile(task.taskState.taskRecord)
if (!b) {
Timber.e("merge block fail")
onFail(false, AriaException("merge block fail"))
return
}
task.taskState.speed = 0
saveData(IEntity.STATE_COMPLETE)
} }
ITaskManager.STATE_RUNNING -> { ITaskManager.STATE_RUNNING -> {
} }
ITaskManager.STATE_UPDATE_PROGRESS -> { ITaskManager.STATE_UPDATE_PROGRESS -> {
val b = msg.data
if (b != null) {
val len = b.getLong(ITaskManager.DATA_ADD_LEN, 0)
progress += len
task.taskState.speed = len
task.taskState.curProgress = progress
}
} }
} }
false false
} }
private fun saveData(state: Int) {
val ts: TaskState = task.taskState
ts.state = state
ts.curProgress = progress
if (state == IEntity.STATE_COMPLETE) {
ts.curProgress = ts.fileSize
removeTask(task)
}
updateState(task.taskId, state, progress)
}
override fun getHandler() = handler override fun getHandler() = handler
/** /**
@ -95,5 +135,4 @@ internal class HttpSubBlockManager(private val task: ITask, private val groupHan
override fun setBlockNum(blockNum: Int) { override fun setBlockNum(blockNum: Int) {
Timber.i("Subtasks do not support chunked downloads") Timber.i("Subtasks do not support chunked downloads")
} }
} }

@ -141,11 +141,11 @@ public abstract class AbsEventListener implements IEventListener {
if (state == IEntity.STATE_CANCEL) { if (state == IEntity.STATE_CANCEL) {
handleCancel(); handleCancel();
TaskCachePool.INSTANCE.removeTask(getTask().getTaskId()); TaskCachePool.INSTANCE.removeTask(getTask());
return; return;
} }
if (state == IEntity.STATE_COMPLETE) { if (state == IEntity.STATE_COMPLETE) {
TaskCachePool.INSTANCE.removeTask(getTask().getTaskId()); TaskCachePool.INSTANCE.removeTask(getTask());
} }
TaskCachePool.INSTANCE.updateState(mTask.getTaskId(), state, location); TaskCachePool.INSTANCE.updateState(mTask.getTaskId(), state, location);

@ -32,21 +32,21 @@ object TaskCachePool {
*/ */
private val entityMap = ConcurrentHashMap<Int, BaseEntity>() private val entityMap = ConcurrentHashMap<Int, BaseEntity>()
/**
* task cache map; key: if task is [DownloadGroupTask], it's filePath else it's service url
*/
private val taskMap = ConcurrentHashMap<String, ITask>() private val taskMap = ConcurrentHashMap<String, ITask>()
/** fun removeTask(task: ITask) {
* @param key if task is [DownloadGroupTask], it's filePath else it's service url when {
*/ task is SingleDownloadTask -> {
fun removeTask(key: String) { taskMap.remove(task.url)
taskMap.remove(key) }
task::javaClass.name == "com.arialyy.dua.group.HttpDGroupTask" -> {
taskMap.remove(task.filePath)
}
}
} }
/** /**
* if task is completed, stopped, canceled, return null * if task is completed, stopped, canceled, return null
* @param key if task is [DownloadGroupTask], it's filePath else it's service url
*/ */
fun getTaskByKey(key: String) = taskMap[key] fun getTaskByKey(key: String) = taskMap[key]
@ -55,11 +55,11 @@ object TaskCachePool {
} }
fun putTask(task: ITask) { fun putTask(task: ITask) {
when (task) { when {
is SingleDownloadTask -> { task is SingleDownloadTask -> {
taskMap[task.url] = task taskMap[task.url] = task
} }
is com.arialyy.dua.group.DownloadGroupTask -> { task::javaClass.name == "com.arialyy.dua.group.HttpDGroupTask" -> {
taskMap[task.filePath] = task taskMap[task.filePath] = task
} }
} }

@ -1,8 +1,14 @@
package com.arialyy.aria.util package com.arialyy.aria.util
import android.net.Uri import android.net.Uri
import com.arialyy.aria.core.DuaContext
import com.arialyy.aria.core.task.ITask
import com.arialyy.aria.core.task.TaskCachePool
import com.arialyy.aria.orm.entity.BlockRecord import com.arialyy.aria.orm.entity.BlockRecord
import com.arialyy.aria.orm.entity.DEntity
import com.arialyy.aria.orm.entity.TaskRecord import com.arialyy.aria.orm.entity.TaskRecord
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
@ -25,6 +31,25 @@ import java.io.FileOutputStream
*/ */
object BlockUtil { object BlockUtil {
/**
* 1.remove all block
* 2.remove record
*/
fun removeTaskBlock(task: ITask) {
val file = FileUri.getPathByUri(task.taskState.taskRecord.filePath)?.let { File(it) }
file?.parentFile?.let {
FileUtils.deleteDir(it)
}
DuaContext.duaScope.launch(Dispatchers.IO) {
val entity = TaskCachePool.getEntity(taskId = task.taskId)
val db = DuaContext.getServiceManager().getDbService().getDuaDb()
db.getRecordDao().deleteTaskRecord(task.taskState.taskRecord)
db.getDEntityDao().delete(entity as DEntity)
}
}
fun getBlockPathFormUri(fileSaveUri: Uri, blockId: Int): String { fun getBlockPathFormUri(fileSaveUri: Uri, blockId: Int): String {
val filePath = FileUri.getPathByUri(fileSaveUri) ?: "/" val filePath = FileUri.getPathByUri(fileSaveUri) ?: "/"
val fileName = FileUtils.getFileNameFromPath(filePath) val fileName = FileUtils.getFileNameFromPath(filePath)

Loading…
Cancel
Save