diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 1fc705d02..9322fca8a 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -3,6 +3,7 @@ package io.legado.app.ui.book.info import android.app.Application import android.content.Intent import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.constant.EventBus @@ -11,12 +12,15 @@ import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookSource import io.legado.app.help.BookHelp +import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.ReadBook import io.legado.app.model.localBook.LocalBook import io.legado.app.model.webBook.WebBook import io.legado.app.utils.postEvent import io.legado.app.utils.toastOnUi +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.ensureActive class BookInfoViewModel(application: Application) : BaseViewModel(application) { val bookData = MutableLiveData() @@ -24,6 +28,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { var durChapterIndex = 0 var inBookshelf = false var bookSource: BookSource? = null + var changeSourceCoroutine: Coroutine<*>? = null fun initData(intent: Intent) { execute { @@ -69,12 +74,14 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } fun loadBookInfo( - book: Book, canReName: Boolean = true, + book: Book, + canReName: Boolean = true, + scope: CoroutineScope = viewModelScope, changeDruChapterIndex: ((chapters: List) -> Unit)? = null, ) { - execute { + execute(scope) { if (book.isLocalBook()) { - loadChapter(book, changeDruChapterIndex) + loadChapter(book, scope, changeDruChapterIndex) } else { bookSource?.let { bookSource -> WebBook.getBookInfo(this, bookSource, book, canReName = canReName) @@ -83,7 +90,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { if (inBookshelf) { appDb.bookDao.update(book) } - loadChapter(it, changeDruChapterIndex) + loadChapter(it, scope, changeDruChapterIndex) }.onError { context.toastOnUi(R.string.error_get_book_info) } @@ -97,9 +104,10 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { private fun loadChapter( book: Book, - changeDruChapterIndex: ((chapters: List) -> Unit)? = null + scope: CoroutineScope = viewModelScope, + changeDruChapterIndex: ((chapters: List) -> Unit)? = null, ) { - execute { + execute(scope) { if (book.isLocalBook()) { LocalBook.getChapterList(book).let { appDb.bookDao.update(book) @@ -142,7 +150,8 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } fun changeTo(source: BookSource, newBook: Book) { - execute { + changeSourceCoroutine?.cancel() + changeSourceCoroutine = execute { var oldTocSize: Int = newBook.totalChapterNum if (inBookshelf) { bookData.value?.let { @@ -153,11 +162,13 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { bookData.postValue(newBook) bookSource = source if (newBook.tocUrl.isEmpty()) { - loadBookInfo(newBook, false) { + loadBookInfo(newBook, false, this) { + ensureActive() upChangeDurChapterIndex(newBook, oldTocSize, it) } } else { - loadChapter(newBook) { + loadChapter(newBook, this) { + ensureActive() upChangeDurChapterIndex(newBook, oldTocSize, it) } }