From f7bf1d624bfd1dacc0fc98d539ce322399fa74b4 Mon Sep 17 00:00:00 2001 From: tarsin Date: Tue, 14 Feb 2023 15:45:55 +0800 Subject: [PATCH] Only cancel decode job for recycled viewHolder --- .../hippo/ehviewer/gallery/ArchivePageLoader.java | 3 ++- .../com/hippo/ehviewer/gallery/EhPageLoader.java | 5 +++-- .../java/com/hippo/ehviewer/spider/SpiderQueen.java | 7 ++++--- .../com/hippo/ehviewer/spider/SpiderQueenWorker.kt | 12 ++++++------ .../kanade/tachiyomi/ui/reader/loader/PageLoader.kt | 4 ++-- .../ui/reader/viewer/pager/PagerViewerAdapter.kt | 4 +++- .../ui/reader/viewer/webtoon/WebtoonAdapter.kt | 1 + 7 files changed, 21 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.java b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.java index 4584b436b..fcfe6d264 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.java @@ -46,6 +46,7 @@ import java.util.Stack; import java.util.concurrent.atomic.AtomicInteger; import eu.kanade.tachiyomi.ui.reader.loader.PageLoader; +import kotlin.Pair; public class ArchivePageLoader extends PageLoader2 { private static final AtomicInteger sIdGenerator = new AtomicInteger(); @@ -187,7 +188,7 @@ public class ArchivePageLoader extends PageLoader2 { } @Override - protected void preloadPages(@NonNull List pages) { + protected void preloadPages(@NonNull List pages, @NonNull Pair pair) { } diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/EhPageLoader.java b/app/src/main/java/com/hippo/ehviewer/gallery/EhPageLoader.java index bc891d874..6b7f1c129 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/EhPageLoader.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/EhPageLoader.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Locale; import eu.kanade.tachiyomi.ui.reader.loader.PageLoader; +import kotlin.Pair; public class EhPageLoader extends PageLoader2 implements SpiderQueen.OnSpiderListener { @@ -191,9 +192,9 @@ public class EhPageLoader extends PageLoader2 implements SpiderQueen.OnSpiderLis } @Override - protected void preloadPages(@NonNull List pages) { + protected void preloadPages(@NonNull List pages, @NonNull Pair pair) { if (mSpiderQueen != null) { - mSpiderQueen.preloadPages(pages); + mSpiderQueen.preloadPages(pages, pair); } } 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 34e228243..30635bf78 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java @@ -51,6 +51,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import eu.kanade.tachiyomi.ui.reader.loader.PageLoader; +import kotlin.Pair; import kotlinx.coroutines.CoroutineScopeKt; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -379,15 +380,15 @@ public final class SpiderQueen implements Runnable { return; } - mWorkerScope.cancel(index); + mWorkerScope.cancelDecode(index); } - public void preloadPages(@NonNull List pages) { + public void preloadPages(@NonNull List pages, @NonNull Pair pair) { if (mQueenThread == null) { return; } - mWorkerScope.updateRAList(pages); + mWorkerScope.updateRAList(pages, pair); } private void request(int index, boolean force) { 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 2393583ac..32a76ebac 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueenWorker.kt @@ -45,12 +45,8 @@ class SpiderQueenWorker(private val queen: SpiderQueen) : CoroutineScope { override val coroutineContext: CoroutineContext get() = Dispatchers.IO + Job() - fun cancel(index: Int) { + fun cancelDecode(index: Int) { decoder.cancel(index) - if (isDownloadMode) return - synchronized(mFetcherJobMap) { - mFetcherJobMap.remove(index)?.cancel() - } } @Synchronized @@ -60,9 +56,13 @@ class SpiderQueenWorker(private val queen: SpiderQueen) : CoroutineScope { isDownloadMode = true } - fun updateRAList(list: List) { + fun updateRAList(list: List, cancelBounds: Pair = 0 to Int.MAX_VALUE) { if (isDownloadMode) return synchronized(mFetcherJobMap) { + mFetcherJobMap.forEach { (i, job) -> + if (i < cancelBounds.first || i > cancelBounds.second) + job.cancel() + } list.forEach { if (mFetcherJobMap[it]?.isActive != true) doLaunchDownloadJob(it, false) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt index 699814b11..4abbf8209 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt @@ -47,14 +47,14 @@ abstract class PageLoader { // val pagesAbsent = (index until (mPreloads + index).coerceAtMost(size())).toMutableList().removeAll(mImageCache.snapshot().keys) // Should we refresh our LruCache ? val pagesAbsent = ((index - 5).coerceAtLeast(0) until (mPreloads + index).coerceAtMost(size())).mapNotNull { it.takeIf { mImageCache[it] == null } } - preloadPages(pagesAbsent) + preloadPages(pagesAbsent, (index - 10).coerceAtLeast(0) to (mPreloads + index + 10).coerceAtMost(size())) } fun retryPage(page: ReaderPage) { onForceRequest(mPages.indexOf(page)) } - protected abstract fun preloadPages(pages: List) + protected abstract fun preloadPages(pages: List, pair: Pair) protected abstract fun onRequest(index: Int) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt index be5200432..d8b64431c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewerAdapter.kt @@ -61,7 +61,9 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() { } } - override fun destroyView(container: ViewGroup, position: Int, view: View) {} + override fun destroyView(container: ViewGroup, position: Int, view: View) { + currentChapter?.cancelRequest(position) + } /** * Returns the current position of the given [view] on the adapter. diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonAdapter.kt index 73893bf21..5f9da8160 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonAdapter.kt @@ -84,6 +84,7 @@ class WebtoonAdapter(val viewer: WebtoonViewer) : RecyclerView.Adapter holder.recycle() }