diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt index da82a564a..d3d982e96 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -34,7 +34,7 @@ import com.hippo.ehviewer.util.sendTo import com.hippo.ehviewer.yorozuya.FileUtils import com.hippo.unifile.UniFile import com.hippo.unifile.openOutputStream -import kotlinx.coroutines.runInterruptible +import moe.tarsin.coroutines.runInterruptibleOkio import moe.tarsin.coroutines.runSuspendCatching import okhttp3.Response import okio.buffer @@ -145,7 +145,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { suspend fun doSave(outFile: UniFile): Long { var ret = 0L - runInterruptible { + runInterruptibleOkio { outFile.openOutputStream().sink().buffer().use { sink -> response.body.source().use { source -> while (true) { diff --git a/app/src/main/java/moe/tarsin/coroutines/Interruptible.kt b/app/src/main/java/moe/tarsin/coroutines/Interruptible.kt new file mode 100644 index 000000000..2cb9b24d5 --- /dev/null +++ b/app/src/main/java/moe/tarsin/coroutines/Interruptible.kt @@ -0,0 +1,24 @@ +package moe.tarsin.coroutines + +import kotlinx.coroutines.runInterruptible +import java.io.InterruptedIOException +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext + +// See https://github.com/Kotlin/kotlinx.coroutines/issues/3551 +suspend inline fun runInterruptibleOkio( + context: CoroutineContext = EmptyCoroutineContext, + crossinline block: () -> T, +): T = runInterruptible(context) { + try { + block() + } catch (e: InterruptedIOException) { + if (Thread.currentThread().isInterrupted) { + // Coroutine cancelled + throw InterruptedException().initCause(e) + } else { + // AsyncTimeout reached + throw e + } + } +}