From 54b0cb8a4903d7c0151eda923a2e5475c77c36c7 Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Sun, 17 Sep 2023 22:55:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/help/coroutine/Coroutine.kt | 2 +- .../main/java/io/legado/app/model/ReadBook.kt | 24 +++++++++++++------ .../app/ui/book/read/ReadBookActivity.kt | 13 +++++++--- .../app/ui/book/read/ReadBookViewModel.kt | 4 +++- .../app/ui/book/read/page/ContentTextView.kt | 4 ++-- .../read/page/provider/TextPageFactory.kt | 4 ++-- 6 files changed, 35 insertions(+), 16 deletions(-) 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 4a0965f7c..4610ae334 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 @@ -138,7 +138,7 @@ class Coroutine( job.cancel(cause) } cancel?.let { - MainScope().launch { + MainScope().launch(executeContext) { if (null == it.context) { it.block.invoke(scope) } else { diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt index 8eda351a9..24226c687 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -20,6 +20,7 @@ import io.legado.app.utils.toastOnUi import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.MainScope +import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.delay import kotlinx.coroutines.launch import splitties.init.appCtx @@ -55,6 +56,7 @@ object ReadBook : CoroutineScope by MainScope() { var preDownloadTask: Coroutine<*>? = null val downloadedChapters = hashSetOf() var contentProcessor: ContentProcessor? = null + val downloadScope = CoroutineScope(SupervisorJob() + IO) //暂时保存跳转前进度 fun saveCurrentBookProcess() { @@ -347,7 +349,7 @@ object ReadBook : CoroutineScope by MainScope() { success?.invoke() } } ?: download( - this, + downloadScope, chapter, resetPageOffset = resetPageOffset, pageChanged = pageChanged @@ -378,7 +380,12 @@ object ReadBook : CoroutineScope by MainScope() { downloadedChapters.add(chapter.index) } else { delay(1000) - download(this, chapter, resetPageOffset = false, pageChanged = false) + download( + downloadScope, + chapter, + resetPageOffset = false, + pageChanged = false + ) } } ?: removeLoading(index) } catch (e: Exception) { @@ -513,16 +520,19 @@ object ReadBook : CoroutineScope by MainScope() { } fun saveRead() { - Coroutine.async { + Coroutine.async(executeContext = IO) { val book = book ?: return@async book.lastCheckCount = 0 book.durChapterTime = System.currentTimeMillis() + val chapterChanged = book.durChapterIndex != durChapterIndex book.durChapterIndex = durChapterIndex book.durChapterPos = durChapterPos - appDb.bookChapterDao.getChapter(book.bookUrl, durChapterIndex)?.let { - book.durChapterTitle = it.getDisplayTitle( - ContentProcessor.get(book.name, book.origin).getTitleReplaceRules() - ) + if (chapterChanged) { + appDb.bookChapterDao.getChapter(book.bookUrl, durChapterIndex)?.let { + book.durChapterTitle = it.getDisplayTitle( + ContentProcessor.get(book.name, book.origin).getTitleReplaceRules() + ) + } } appDb.bookDao.update(book) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 5057da78b..c4766a435 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -215,12 +215,16 @@ class ReadBookActivity : BaseReadBookActivity(), override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) - viewModel.initData(intent) + viewModel.initData(intent) { + upMenu() + } } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) - viewModel.initData(intent ?: return) + viewModel.initData(intent ?: return) { + upMenu() + } } override fun onWindowFocusChanged(hasFocus: Boolean) { @@ -244,7 +248,9 @@ class ReadBookActivity : BaseReadBookActivity(), if (bookChanged) { bookChanged = false ReadBook.callBack = this - viewModel.initData(intent) + viewModel.initData(intent) { + upMenu() + } } else { //web端阅读时,app处于阅读界面,本地记录会覆盖web保存的进度,在此处恢复 ReadBook.webBookProgress?.let { @@ -1368,6 +1374,7 @@ class ReadBookActivity : BaseReadBookActivity(), ReadBook.callBack = null } ReadBook.preDownloadTask?.cancel() + ReadBook.downloadScope.coroutineContext.cancelChildren() ReadBook.downloadedChapters.clear() if (!BuildConfig.DEBUG) { Backup.autoBack(this) 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 9cb45f724..7bd667c41 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 @@ -56,7 +56,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { /** * 初始化 */ - fun initData(intent: Intent) { + fun initData(intent: Intent, success: (() -> Unit)? = null) { execute { ReadBook.inBookshelf = intent.getBooleanExtra("inBookshelf", true) ReadBook.tocChanged = intent.getBooleanExtra("tocChanged", false) @@ -70,6 +70,8 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { book != null -> initBook(book) else -> ReadBook.upMsg(context.getString(R.string.no_book)) } + }.onSuccess { + success?.invoke() }.onError { val msg = "初始化数据失败\n${it.localizedMessage}" ReadBook.upMsg(msg) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt index b293f5686..0a5cdb78d 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt @@ -285,14 +285,14 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at val offset = (ChapterProvider.visibleHeight - textPage.height).toInt() pageOffset = min(0, offset) } else if (pageOffset > 0) { - pageFactory.moveToPrev(false) + pageFactory.moveToPrev(true) textPage = pageFactory.curPage pageOffset -= textPage.height.toInt() upView?.invoke(textPage) contentDescription = textPage.text } else if (pageOffset < -textPage.height) { pageOffset += textPage.height.toInt() - pageFactory.moveToNext(false) + pageFactory.moveToNext(true) textPage = pageFactory.curPage upView?.invoke(textPage) contentDescription = textPage.text diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextPageFactory.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextPageFactory.kt index 1bceccd6a..c38a62cbd 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextPageFactory.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextPageFactory.kt @@ -39,8 +39,8 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource ReadBook.moveToNextChapter(upContent) } else { ReadBook.setPageIndex(pageIndex.plus(1)) + if (upContent) upContent(resetPageOffset = false) } - if (upContent) upContent(resetPageOffset = false) true } else false @@ -52,8 +52,8 @@ class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource ReadBook.moveToPrevChapter(upContent) } else { ReadBook.setPageIndex(pageIndex.minus(1)) + if (upContent) upContent(resetPageOffset = false) } - if (upContent) upContent(resetPageOffset = false) true } else false