Only cancel decode job for recycled viewHolder

This commit is contained in:
tarsin committed 2023-02-14 15:45:55 +08:00
1 parent d7b08a0181
commit f7bf1d624b
7 files changed
+21 -15

No files matched your search

@@ -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<Integer> pages) {
protected void preloadPages(@NonNull List<Integer> pages, @NonNull Pair<Integer, Integer> pair) {
}
@@ -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<Integer> pages) {
protected void preloadPages(@NonNull List<Integer> pages, @NonNull Pair<Integer, Integer> pair) {
if (mSpiderQueen != null) {
mSpiderQueen.preloadPages(pages);
mSpiderQueen.preloadPages(pages, pair);
}
}
@@ -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<Integer> pages) {
public void preloadPages(@NonNull List<Integer> pages, @NonNull Pair<Integer, Integer> pair) {
if (mQueenThread == null) {
return;
}
mWorkerScope.updateRAList(pages);
mWorkerScope.updateRAList(pages, pair);
}
private void request(int index, boolean force) {
@@ -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<Int>) {
fun updateRAList(list: List<Int>, cancelBounds: Pair<Int, Int> = 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)
@@ -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<Int>)
protected abstract fun preloadPages(pages: List<Int>, pair: Pair<Int, Int>)
protected abstract fun onRequest(index: Int)
@@ -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.
@@ -84,6 +84,7 @@ class WebtoonAdapter(val viewer: WebtoonViewer) : RecyclerView.Adapter<RecyclerV
* Recycles an existing view [holder] before adding it to the view pool.
*/
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
currentChapter?.cancelRequest(holder.bindingAdapterPosition)
when (holder) {
is WebtoonPageHolder -> holder.recycle()
}