pull/1817/head
kunfei 3 years ago
parent 6c806d496b
commit b1f3e10453
  1. 21
      app/src/main/java/io/legado/app/utils/RegexExtensions.kt

@ -2,32 +2,39 @@ package io.legado.app.utils
import io.legado.app.exception.RegexTimeoutException import io.legado.app.exception.RegexTimeoutException
import io.legado.app.help.CrashHandler import io.legado.app.help.CrashHandler
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import splitties.init.appCtx import splitties.init.appCtx
import kotlin.concurrent.thread
import kotlin.coroutines.resume import kotlin.coroutines.resume
/**
* 带有超时检测的正则替换
* 超时重启apk,线程不能强制结束,只能重启apk
*/
@DelicateCoroutinesApi
suspend fun CharSequence.replace(regex: Regex, replacement: String, timeout: Long): String { suspend fun CharSequence.replace(regex: Regex, replacement: String, timeout: Long): String {
val charSequence = this
return suspendCancellableCoroutine { block -> return suspendCancellableCoroutine { block ->
val thread = thread { val scope = GlobalScope.launch(IO) {
try { try {
val result = regex.replace(this, replacement) val result = regex.replace(charSequence, replacement)
block.resume(result) block.resume(result)
} catch (e: Exception) { } catch (e: Exception) {
block.cancel(e) block.cancel(e)
} }
} }
mainHandler.postDelayed({ mainHandler.postDelayed({
if (thread.isAlive) { if (scope.isActive) {
val timeoutMsg = "替换超时,将在3秒后重启应用\n替换规则$regex\n替换内容:${this}" val timeoutMsg = "替换超时,将在3秒后重启应用\n替换规则$regex\n替换内容:${this}"
val exception = RegexTimeoutException(timeoutMsg) val exception = RegexTimeoutException(timeoutMsg)
block.cancel(exception) block.cancel(exception)
appCtx.longToastOnUi(timeoutMsg) appCtx.longToastOnUi(timeoutMsg)
CrashHandler.saveCrashInfo2File(exception) CrashHandler.saveCrashInfo2File(exception)
mainHandler.postDelayed({ mainHandler.postDelayed({
if (thread.isAlive) { appCtx.restart()
appCtx.restart()
}
}, 3000) }, 3000)
} }
}, timeout) }, timeout)

Loading…
Cancel
Save