diff --git a/app/src/main/java/io/legado/app/service/CacheBookService.kt b/app/src/main/java/io/legado/app/service/CacheBookService.kt index 4bafd29aa..25d2dcc85 100644 --- a/app/src/main/java/io/legado/app/service/CacheBookService.kt +++ b/app/src/main/java/io/legado/app/service/CacheBookService.kt @@ -49,6 +49,7 @@ class CacheBookService : BaseService() { companion object { private const val MB = 1024L * 1024L private const val DIAGNOSTICS_LOG_INTERVAL_MILLIS = 5_000L + private const val MAX_IDLE_SPIN_MS = 60_000L var isRun = false private set @@ -181,15 +182,8 @@ class CacheBookService : BaseService() { admissionIdleWaiters.values.flatten().forEach { it.complete(Unit) } admissionIdleWaiters.clear() } - serviceCommandScope.launch { - try { - serviceCommandMutex.withLock { - CacheBook.close(clearFailureState = false) - } - } finally { - serviceCommandScope.cancel() - } - } + CacheBook.close(clearFailureState = false) + serviceCommandScope.cancel() super.onDestroy() } @@ -486,14 +480,22 @@ class CacheBookService : BaseService() { private suspend fun runDownloadLoop() { try { + var lastActiveTime = System.currentTimeMillis() while (currentCoroutineContext().isActive) { drainPendingDownloadRequests() if (CacheBook.isGloballyPaused) { - delay(200) - continue + break + } + val isActiveNow = CacheBook.isRun + || hasPendingDownloadRequests() + || hasAdmittingRequests() + if (isActiveNow) { + lastActiveTime = System.currentTimeMillis() + } else { + break } if (!CacheBook.isRun) { - if (!hasPendingDownloadRequests() && !hasAdmittingRequests()) break + if (System.currentTimeMillis() - lastActiveTime > MAX_IDLE_SPIN_MS) break delay(200) continue }