Only cancel decode job for recycled viewHolder
This commit is contained in:
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()
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user