Просмотр исходного кода

fix(replace): 正则完成后回收超时看门狗,修复大规则集下替换净化 OOM

每次替换都向主线程投递延迟 timeout 的看门狗 runnable,原本从不主动清理,
要等满整个 timeout 窗口才出队;其 lambda 捕获整段正文,规则数量多时
3 秒内堆积成百上千份正文拷贝,撑爆堆导致主线程 MessageQueue 处 OOM。
为看门狗补上回收机制:正则完成时 removeCallbacks 立即撤除未触发的消息,
释放被钉住的正文拷贝。超时/重启兜底逻辑不变。
5151561 3 месяцев назад
Родитель
Сommit
0286de4507
1 измененных файлов с 6 добавлено и 1 удалено
  1. 6 1
      app/src/main/java/io/legado/app/utils/RegexExtensions.kt

+ 6 - 1
app/src/main/java/io/legado/app/utils/RegexExtensions.kt

@@ -66,7 +66,7 @@ fun CharSequence.replace(
                     block.resumeWithException(e)
                 }
             }
-            handler.postDelayed(timeout) {
+            val timeoutRunnable = handler.postDelayed(timeout) {
                 if (coroutine.isActive) {
                     val timeoutMsg =
                         "替换超时,3秒后还未结束将重启应用\n替换规则$regex\n替换内容:$charSequence"
@@ -81,6 +81,11 @@ fun CharSequence.replace(
                     }
                 }
             }
+            // 正则结束后立即撤掉看门狗,否则它会在主线程消息队列里存活整个 timeout 窗口,
+            // 并钉住整段正文拷贝;规则数量多时会在 3 秒内堆积成百上千份拷贝导致 OOM。
+            coroutine.invokeOnCompletion {
+                handler.removeCallbacks(timeoutRunnable)
+            }
         }
     }
 }