Преглед изворни кода

应用后台时间过长时,下载崩溃的问题

HapeLee пре 6 месеци
родитељ
комит
4beeb2d4f6
1 измењених фајлова са 14 додато и 12 уклоњено
  1. 14 12
      app/src/main/java/io/legado/app/service/CacheBookService.kt

+ 14 - 12
app/src/main/java/io/legado/app/service/CacheBookService.kt

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