|
@@ -135,6 +135,8 @@ object CacheBook {
|
|
|
private val onDownloadSet = linkedSetOf<Int>()
|
|
private val onDownloadSet = linkedSetOf<Int>()
|
|
|
private val successDownloadSet = linkedSetOf<Int>()
|
|
private val successDownloadSet = linkedSetOf<Int>()
|
|
|
private val errorDownloadMap = hashMapOf<Int, Int>()
|
|
private val errorDownloadMap = hashMapOf<Int, Int>()
|
|
|
|
|
+ private var isStopped = false
|
|
|
|
|
+ private var waitingRetry = false
|
|
|
|
|
|
|
|
val waitCount get() = waitDownloadSet.size
|
|
val waitCount get() = waitDownloadSet.size
|
|
|
val onDownloadCount get() = onDownloadSet.size
|
|
val onDownloadCount get() = onDownloadSet.size
|
|
@@ -146,13 +148,20 @@ object CacheBook {
|
|
|
return waitDownloadSet.size > 0 || onDownloadSet.size > 0
|
|
return waitDownloadSet.size > 0 || onDownloadSet.size > 0
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Synchronized
|
|
|
|
|
+ fun isStop(): Boolean {
|
|
|
|
|
+ return isStopped || (!isRun() && !waitingRetry)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Synchronized
|
|
@Synchronized
|
|
|
fun stop() {
|
|
fun stop() {
|
|
|
waitDownloadSet.clear()
|
|
waitDownloadSet.clear()
|
|
|
|
|
+ isStopped = true
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Synchronized
|
|
@Synchronized
|
|
|
fun addDownload(start: Int, end: Int) {
|
|
fun addDownload(start: Int, end: Int) {
|
|
|
|
|
+ isStopped = false
|
|
|
for (i in start..end) {
|
|
for (i in start..end) {
|
|
|
if (!onDownloadSet.contains(i)) {
|
|
if (!onDownloadSet.contains(i)) {
|
|
|
waitDownloadSet.add(i)
|
|
waitDownloadSet.add(i)
|
|
@@ -168,13 +177,18 @@ object CacheBook {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Synchronized
|
|
@Synchronized
|
|
|
- private fun onError(index: Int, error: Throwable, chapterTitle: String) {
|
|
|
|
|
|
|
+ private fun onPreError(index: Int, error: Throwable) {
|
|
|
|
|
+ waitingRetry = true
|
|
|
if (error !is ConcurrentException) {
|
|
if (error !is ConcurrentException) {
|
|
|
errorDownloadMap[index] = (errorDownloadMap[index] ?: 0) + 1
|
|
errorDownloadMap[index] = (errorDownloadMap[index] ?: 0) + 1
|
|
|
}
|
|
}
|
|
|
onDownloadSet.remove(index)
|
|
onDownloadSet.remove(index)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Synchronized
|
|
|
|
|
+ private fun onPostError(index: Int, error: Throwable, chapterTitle: String) {
|
|
|
//重试3次
|
|
//重试3次
|
|
|
- if ((errorDownloadMap[index] ?: 0) < 3) {
|
|
|
|
|
|
|
+ if ((errorDownloadMap[index] ?: 0) < 3 && !isStopped) {
|
|
|
waitDownloadSet.add(index)
|
|
waitDownloadSet.add(index)
|
|
|
} else {
|
|
} else {
|
|
|
AppLog.put(
|
|
AppLog.put(
|
|
@@ -182,12 +196,19 @@ object CacheBook {
|
|
|
error
|
|
error
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
+ waitingRetry = false
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Synchronized
|
|
|
|
|
+ private fun onError(index: Int, error: Throwable, chapterTitle: String) {
|
|
|
|
|
+ onPreError(index, error)
|
|
|
|
|
+ onPostError(index, error, chapterTitle)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Synchronized
|
|
@Synchronized
|
|
|
private fun onCancel(index: Int) {
|
|
private fun onCancel(index: Int) {
|
|
|
onDownloadSet.remove(index)
|
|
onDownloadSet.remove(index)
|
|
|
- waitDownloadSet.add(index)
|
|
|
|
|
|
|
+ if (!isStopped) waitDownloadSet.add(index)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Synchronized
|
|
@Synchronized
|
|
@@ -234,9 +255,10 @@ object CacheBook {
|
|
|
onSuccess(chapterIndex)
|
|
onSuccess(chapterIndex)
|
|
|
downloadFinish(chapter, content)
|
|
downloadFinish(chapter, content)
|
|
|
}.onError {
|
|
}.onError {
|
|
|
|
|
+ onPreError(chapterIndex, it)
|
|
|
//出现错误等待一秒后重新加入待下载列表
|
|
//出现错误等待一秒后重新加入待下载列表
|
|
|
delay(1000)
|
|
delay(1000)
|
|
|
- onError(chapterIndex, it, chapter.title)
|
|
|
|
|
|
|
+ onPostError(chapterIndex, it, chapter.title)
|
|
|
downloadFinish(chapter, "获取正文失败\n${it.localizedMessage}")
|
|
downloadFinish(chapter, "获取正文失败\n${it.localizedMessage}")
|
|
|
}.onCancel {
|
|
}.onCancel {
|
|
|
onCancel(chapterIndex)
|
|
onCancel(chapterIndex)
|