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 e2e933d91..1f387887b 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -36,6 +36,7 @@ import com.hippo.yorozuya.FileUtils import com.hippo.yorozuya.MathUtils import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.ensureActive +import moe.tarsin.coroutines.runSuspendCatching import okhttp3.executeAsync import okio.buffer import java.io.File @@ -194,7 +195,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { return receivedSize } - findDownloadFileForIndex(index, extension)?.runCatching { + findDownloadFileForIndex(index, extension)?.runSuspendCatching { openOutputStream().use { outputStream -> (outputStream as FileOutputStream).channel.use { return doSave(it) == length } } @@ -208,7 +209,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { val key = EhCacheKeyFactory.getImageKey(mGid, index) val editor = sCache.edit(key) ?: return false var received: Long = 0 - runCatching { + runSuspendCatching { editor.metadata.toFile().writeText(extension) editor.data.toFile().outputStream().use { outputStream -> outputStream.channel.use { received = doSave(it) } diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java index b9dfea7fd..0f4969886 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java @@ -365,7 +365,7 @@ public final class SpiderQueen implements Runnable { request(index, false); } - private int getPageState(int index) { + public int getPageState(int index) { synchronized (mPageStateLock) { if (mPageStateArray != null && index >= 0 && index < mPageStateArray.length) { return mPageStateArray[index]; diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt index 33d90ffe9..271ab3983 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt @@ -12,9 +12,11 @@ import com.hippo.ehviewer.spider.SpiderQueen.NETWORK_ERROR import com.hippo.ehviewer.spider.SpiderQueen.PTOKEN_FAILED_MESSAGE import com.hippo.ehviewer.spider.SpiderQueen.STATE_FAILED import com.hippo.ehviewer.spider.SpiderQueen.STATE_FINISHED +import com.hippo.ehviewer.spider.SpiderQueen.STATE_DOWNLOADING import com.hippo.image.Image.Companion.decode import com.hippo.util.ExceptionUtils import com.hippo.yorozuya.StringUtils +import eu.kanade.tachiyomi.util.lang.launchNonCancellable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -27,7 +29,6 @@ import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withPermit import moe.tarsin.coroutines.runSuspendCatching -import kotlin.coroutines.CoroutineContext class SpiderQueenWorker(private val queen: SpiderQueen) : CoroutineScope { private val spiderDen @@ -79,6 +80,15 @@ class SpiderQueenWorker(private val queen: SpiderQueen) : CoroutineScope { mSemaphore.withPermit { doInJob(index, force) } + }.apply { + invokeOnCompletion { + if (queen.getPageState(index) == STATE_DOWNLOADING) { + Log.d(DEBUG_TAG, "Download image cancelled $index") + launchNonCancellable { + spiderDen.remove(index) + } + } + } } } } @@ -99,7 +109,7 @@ class SpiderQueenWorker(private val queen: SpiderQueen) : CoroutineScope { ?: queen.getPTokenFromInternet(index) ?: queen.getPTokenFromMultiPageViewer(index) } - queen.updatePageState(index, SpiderQueen.STATE_DOWNLOADING) + queen.updatePageState(index, STATE_DOWNLOADING) if (!force && index in spiderDen) { return queen.updatePageState(index, STATE_FINISHED) }