[修复] 修复了书架书籍加载缓慢的问题

This commit is contained in:
HapeLee committed 2025-12-28 03:06:12 +08:00
1 parent 80664185f0
commit 57173d4148
2 files changed
+82 -73

No files matched your search

@@ -23,6 +23,7 @@ import io.legado.app.R
import io.legado.app.base.BaseFragment import io.legado.app.base.BaseFragment
import io.legado.app.constant.AppLog import io.legado.app.constant.AppLog
import io.legado.app.constant.EventBus import io.legado.app.constant.EventBus
import io.legado.app.data.AppDatabase
import io.legado.app.data.appDb import io.legado.app.data.appDb
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookGroup import io.legado.app.data.entities.BookGroup
@@ -44,6 +45,7 @@ import io.legado.app.ui.main.bookshelf.books.styleDefalut.BooksAdapterListCompac
import io.legado.app.utils.bookshelfLayoutGrid import io.legado.app.utils.bookshelfLayoutGrid
import io.legado.app.utils.bookshelfLayoutMode import io.legado.app.utils.bookshelfLayoutMode
import io.legado.app.utils.cnCompare import io.legado.app.utils.cnCompare
import io.legado.app.utils.flowWithLifecycleAndDatabaseChangeFirst
import io.legado.app.utils.observeEvent import io.legado.app.utils.observeEvent
import io.legado.app.utils.startActivity import io.legado.app.utils.startActivity
import io.legado.app.utils.startActivityForBook import io.legado.app.utils.startActivityForBook
@@ -52,6 +54,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.isActive import kotlinx.coroutines.isActive
@@ -204,47 +207,51 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books),
private fun upRecyclerData() { private fun upRecyclerData() {
booksFlowJob?.cancel() booksFlowJob?.cancel()
booksFlowJob = viewLifecycleOwner.lifecycleScope.launch { booksFlowJob = viewLifecycleOwner.lifecycleScope.launch {
appDb.bookDao.flowByGroup(groupId).map { list ->
//排序
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) { val isDescending = AppConfig.bookshelfSortOrder == 1
appDb.bookDao.flowByGroup(groupId) when (bookSort) {
.map { list -> 1 -> if (isDescending) list.sortedByDescending { it.latestChapterTime }
val isDescending = AppConfig.bookshelfSortOrder == 1 else list.sortedBy { it.latestChapterTime }
when (bookSort) { 2 -> if (isDescending)
1 -> if (isDescending) list.sortedByDescending { it.latestChapterTime } list.sortedWith { o1, o2 -> o2.name.cnCompare(o1.name) }
else list.sortedBy { it.latestChapterTime } else
list.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) }
2 -> if (isDescending) 3 -> if (isDescending) list.sortedByDescending { it.order }
list.sortedWith { o1, o2 -> o2.name.cnCompare(o1.name) } else list.sortedBy { it.order }
else
list.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) }
3 -> if (isDescending) list.sortedByDescending { it.order } 4 -> if (isDescending) list.sortedByDescending {
else list.sortedBy { it.order } max(
it.latestChapterTime,
4 -> if (isDescending) it.durChapterTime
list.sortedByDescending { max(it.latestChapterTime, it.durChapterTime) } )
else
list.sortedBy { max(it.latestChapterTime, it.durChapterTime) }
5 -> if (isDescending)
list.sortedWith { o1, o2 -> o2.author.cnCompare(o1.author) }
else
list.sortedWith { o1, o2 -> o1.author.cnCompare(o2.author) }
else ->
if (isDescending) list.sortedByDescending { it.durChapterTime }
else list.sortedBy { it.durChapterTime }
}
}
.flowOn(Dispatchers.Default)
.catch { AppLog.put("书架更新出错", it) }
.collect { list ->
binding.emptyView.isGone = list.isNotEmpty()
binding.refreshLayout.isEnabled = enableRefresh && list.isNotEmpty()
booksAdapter.setItems(list)
} }
else list.sortedBy { max(it.latestChapterTime, it.durChapterTime) }
5 -> if (isDescending)
list.sortedWith { o1, o2 -> o2.author.cnCompare(o1.author) }
else
list.sortedWith { o1, o2 -> o1.author.cnCompare(o2.author) }
else -> if (isDescending) list.sortedByDescending { it.durChapterTime }
else list.sortedBy { it.durChapterTime }
}
}.flowWithLifecycleAndDatabaseChangeFirst(
viewLifecycleOwner.lifecycle,
Lifecycle.State.RESUMED,
AppDatabase.BOOK_TABLE_NAME
).catch {
AppLog.put("书架更新出错", it)
}.conflate().flowOn(Dispatchers.Default).collect { list ->
if (view == null) return@collect
binding.emptyView.isGone = list.isNotEmpty()
binding.refreshLayout.isEnabled = enableRefresh && list.isNotEmpty()
booksAdapter.setItems(list)
delay(500)
} }
} }
} }
@@ -54,6 +54,7 @@ import io.legado.app.utils.startActivityForBook
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
@@ -248,14 +249,16 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
} }
private fun initBooksData() { private fun initBooksData() {
if (groupId == BookGroup.IdRoot) { if (groupId == BookGroup.Companion.IdRoot) {
if (isAdded) { if (isAdded) {
binding.collTopBar.title = getString(R.string.bookshelf) binding.collTopBar.title = getString(R.string.bookshelf)
binding.refreshLayout.isEnabled = true binding.refreshLayout.isEnabled = true
enableRefresh = true enableRefresh = true
} }
} else { } else {
bookGroups.firstOrNull { groupId == it.groupId }?.let { bookGroups.firstOrNull {
groupId == it.groupId
}?.let {
binding.collTopBar.title = it.groupName binding.collTopBar.title = it.groupName
binding.refreshLayout.isEnabled = it.enableRefresh binding.refreshLayout.isEnabled = it.enableRefresh
enableRefresh = it.enableRefresh enableRefresh = it.enableRefresh
@@ -263,49 +266,48 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
} }
booksFlowJob?.cancel() booksFlowJob?.cancel()
booksFlowJob = viewLifecycleOwner.lifecycleScope.launch { booksFlowJob = viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) { appDb.bookDao.flowByGroup(groupId).map { list ->
appDb.bookDao.flowByGroup(groupId) //排序
.map { list -> val isDescending = AppConfig.bookshelfSortOrder == 1
val isDescending = AppConfig.bookshelfSortOrder == 1
val sortType = AppConfig.getBookSortByGroupId(groupId)
when (sortType) { val sortType = AppConfig.getBookSortByGroupId(groupId)
1 -> if (isDescending) list.sortedByDescending { it.latestChapterTime } when (sortType) {
else list.sortedBy { it.latestChapterTime } 1 -> if (isDescending) list.sortedByDescending { it.latestChapterTime }
else list.sortedBy { it.latestChapterTime }
2 -> if (isDescending) 2 -> if (isDescending)
list.sortedWith { o1, o2 -> o2.name.cnCompare(o1.name) } list.sortedWith { o1, o2 -> o2.name.cnCompare(o1.name) }
else else
list.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) } list.sortedWith { o1, o2 -> o1.name.cnCompare(o2.name) }
3 -> if (isDescending) list.sortedByDescending { it.order } 3 -> if (isDescending) list.sortedByDescending { it.order }
else list.sortedBy { it.order } else list.sortedBy { it.order }
4 -> if (isDescending) 4 -> if (isDescending) list.sortedByDescending {
list.sortedByDescending { max(it.latestChapterTime, it.durChapterTime) } max(it.latestChapterTime, it.durChapterTime)
else } else list.sortedBy { max(it.latestChapterTime, it.durChapterTime) }
list.sortedBy { max(it.latestChapterTime, it.durChapterTime) }
5 -> if (isDescending) 5 -> if (isDescending)
list.sortedWith { o1, o2 -> o2.author.cnCompare(o1.author) } list.sortedWith { o1, o2 -> o2.author.cnCompare(o1.author) }
else else
list.sortedWith { o1, o2 -> o1.author.cnCompare(o2.author) } list.sortedWith { o1, o2 -> o1.author.cnCompare(o2.author) }
else -> else -> if (isDescending) list.sortedByDescending { it.durChapterTime }
if (isDescending) list.sortedByDescending { it.durChapterTime } else list.sortedBy { it.durChapterTime }
else list.sortedBy { it.durChapterTime } }
}
}
.flowOn(Dispatchers.Default)
.catch { AppLog.put("书架更新出错", it) }
.collect { list ->
books = list }.flowWithLifecycleAndDatabaseChangeFirst(
booksAdapter.updateItems() viewLifecycleOwner.lifecycle,
val empty = getItemCount() > 0 Lifecycle.State.RESUMED,
binding.emptyView.isGone = empty AppDatabase.Companion.BOOK_TABLE_NAME
binding.refreshLayout.isEnabled = enableRefresh && empty ).catch {
} AppLog.put("书架更新出错", it)
}.conflate().flowOn(Dispatchers.Default).collect { list ->
if (view == null) return@collect
binding.emptyView.isGone = list.isNotEmpty()
binding.refreshLayout.isEnabled = enableRefresh && list.isNotEmpty()
booksAdapter.updateItems()
delay(500)
} }
} }
} }