diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt index 75ee0620a..0a1ead20d 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt @@ -32,7 +32,9 @@ import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Semaphore +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withPermit import java.io.FileOutputStream import java.io.IOException @@ -75,6 +77,7 @@ class ArchivePageLoader(context: Context, uri: Uri, passwdFlow: Flow) : } private val mJobMap = hashMapOf() + private val mWorkerMutex by lazy { (0 until size).map { Mutex() } } private val mSemaphore = Semaphore(4) override fun onRequest(index: Int) { @@ -82,8 +85,10 @@ class ArchivePageLoader(context: Context, uri: Uri, passwdFlow: Flow) : val current = mJobMap[index] if (current?.isActive != true) { mJobMap[index] = launch { - mSemaphore.withPermit { - doRealWork(index) + mWorkerMutex[index].withLock { + mSemaphore.withPermit { + doRealWork(index) + } } } }