This commit is contained in:
Horis
2025-02-05 15:08:44 +08:00
parent 92aa989b40
commit e563b37ef0

View File

@@ -2,7 +2,6 @@ package io.legado.app.help.coroutine
import io.legado.app.utils.printOnDebug
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CompletionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineStart
@@ -26,7 +25,7 @@ import kotlin.coroutines.CoroutineContext
class Coroutine<T>(
val scope: CoroutineScope,
context: CoroutineContext = Dispatchers.IO,
startOption: CoroutineStart = CoroutineStart.DEFAULT,
val startOption: CoroutineStart = CoroutineStart.DEFAULT,
val executeContext: CoroutineContext = Dispatchers.Main,
block: suspend CoroutineScope.() -> T
) {
@@ -58,9 +57,6 @@ class Coroutine<T>(
private var timeMillis: Long? = null
private var errorReturn: Result<T>? = null
private val lazyWaiter =
if (startOption === CoroutineStart.LAZY) CompletableDeferred<Unit>() else null
val isCancelled: Boolean
get() = job.isCancelled
@@ -160,16 +156,19 @@ class Coroutine<T>(
}
fun start() {
lazyWaiter?.complete(Unit)
if (startOption === CoroutineStart.LAZY && isCancelled) {
cancel()
} else {
job.start()
}
}
private fun executeInternal(
context: CoroutineContext,
block: suspend CoroutineScope.() -> T
): Job {
return (scope.plus(executeContext)).launch(start = CoroutineStart.ATOMIC) {
return (scope.plus(executeContext)).launch(start = startOption) {
try {
lazyWaiter?.await()
start?.let { dispatchVoidCallback(this, it) }
ensureActive()
val value = executeBlock(this, context, timeMillis ?: 0L, block)