diff --git a/app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt b/app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt index 350907350..779cf609b 100644 --- a/app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt +++ b/app/src/main/java/io/legado/app/help/coroutine/Coroutine.kt @@ -1,6 +1,5 @@ package io.legado.app.help.coroutine -import io.legado.app.BuildConfig import kotlinx.coroutines.* import timber.log.Timber import kotlin.coroutines.CoroutineContext @@ -138,21 +137,20 @@ class Coroutine( return scope.plus(Dispatchers.Main).launch { try { start?.let { dispatchVoidCallback(this, it) } + ensureActive() val value = executeBlock(scope, context, timeMillis ?: 0L, block) - if (isActive) { - success?.let { dispatchCallback(this, value, it) } - } + ensureActive() + success?.let { dispatchCallback(this, value, it) } + } catch (e: CancellationException) { + Timber.e("任务取消") } catch (e: Throwable) { - if (BuildConfig.DEBUG) { - Timber.e(e) - } + Timber.e(e) val consume: Boolean = errorReturn?.value?.let { value -> if (isActive) { success?.let { dispatchCallback(this, value, it) } } true } ?: false - if (!consume && isActive) { error?.let { dispatchCallback(this, e, it) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 18af0b1b2..d233148f6 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -13,6 +13,7 @@ import io.legado.app.data.entities.BookSource import io.legado.app.help.AppConfig import io.legado.app.help.BookHelp import io.legado.app.help.ContentProcessor +import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.storage.AppWebDav import io.legado.app.model.NoStackTraceException import io.legado.app.model.ReadAloud @@ -25,10 +26,12 @@ import io.legado.app.utils.msg import io.legado.app.utils.postEvent import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.ensureActive class ReadBookViewModel(application: Application) : BaseViewModel(application) { var isInitFinish = false var searchContentQuery = "" + var changeSourceCoroutine: Coroutine<*>? = null fun initData(intent: Intent) { execute { @@ -165,12 +168,15 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } fun changeTo(source: BookSource, book: Book) { - execute { + changeSourceCoroutine?.cancel() + changeSourceCoroutine = execute { ReadBook.upMsg(context.getString(R.string.loading)) if (book.tocUrl.isEmpty()) { WebBook.getBookInfoAwait(this, source, book) } + ensureActive() val chapters = WebBook.getChapterListAwait(this, source, book) + ensureActive() val oldBook = ReadBook.book!! book.durChapterIndex = BookHelp.getDurChapter( oldBook.durChapterIndex,