From bc5032b2d0f02a5103c9c7bd6ac4d5fedb06993d Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Mon, 28 Oct 2024 23:52:33 +0800 Subject: [PATCH] Fix off-screen fetcher jobs blocking decode queue --- .../com/hippo/ehviewer/gallery/ArchivePageLoader.kt | 4 ++++ .../kotlin/com/hippo/ehviewer/gallery/EhPageLoader.kt | 4 ++++ .../main/kotlin/com/hippo/ehviewer/gallery/PageLoader.kt | 6 ++++++ .../main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt | 8 ++++++++ .../main/kotlin/com/hippo/ehviewer/ui/reader/PagerItem.kt | 5 +++++ 5 files changed, 27 insertions(+) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt b/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt index 3968d2051..5b97b5b85 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt @@ -143,6 +143,10 @@ class ArchivePageLoader( override val isReady: Boolean get() = size != 0 + override fun onCancelRequest(index: Int) { + jobs[index]?.cancel() + } + override val title by lazy { FileUtils.getNameFromFilename(file.name)!! } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/gallery/EhPageLoader.kt b/app/src/main/kotlin/com/hippo/ehviewer/gallery/EhPageLoader.kt index f9ae912c9..9f16f2e06 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/gallery/EhPageLoader.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/gallery/EhPageLoader.kt @@ -66,6 +66,10 @@ class EhPageLoader(private val mGalleryInfo: GalleryInfo, startPage: Int) : override val isReady: Boolean get() = ::mSpiderQueen.isInitialized && mSpiderQueen.isReady + override fun onCancelRequest(index: Int) { + mSpiderQueen.cancelRequest(index) + } + override fun onGetPages(pages: Int) {} override fun onGet509(index: Int) {} diff --git a/app/src/main/kotlin/com/hippo/ehviewer/gallery/PageLoader.kt b/app/src/main/kotlin/com/hippo/ehviewer/gallery/PageLoader.kt index 5501d2fad..087363b21 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/gallery/PageLoader.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/gallery/PageLoader.kt @@ -109,6 +109,12 @@ abstract class PageLoader { protected abstract fun onForceRequest(index: Int, orgImg: Boolean) + fun cancelRequest(index: Int) { + onCancelRequest(index) + } + + protected abstract fun onCancelRequest(index: Int) + fun notifyPageWait(index: Int) { pages[index].reset() } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt index 7a9bfb641..8ad0e5453 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -281,6 +281,10 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS } } + fun cancelRequest(index: Int) { + mWorkerScope.cancelDecode(index) + } + fun preloadPages(pages: List, pair: Pair) { mWorkerScope.updateRAList(pages, pair) } @@ -503,6 +507,10 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS var isDownloadMode = false private set + fun cancelDecode(index: Int) { + decoder.cancel(index) + } + @Synchronized fun enterDownloadMode() { if (isDownloadMode) return diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerItem.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerItem.kt index f3c59598f..200e2f2c4 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerItem.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerItem.kt @@ -61,6 +61,11 @@ fun PagerItem( } } } + DisposableEffect(Unit) { + onDispose { + pageLoader.cancelRequest(page.index) + } + } val defaultError = stringResource(id = R.string.decode_image_error) when (val state = page.statusObserved) { is PageStatus.Queued, is PageStatus.Loading -> {