This commit is contained in:
Horis 2024-06-26 06:36:40 +08:00
parent b0f76445f8
commit 636c369351
4 changed files with 38 additions and 9 deletions

View File

@ -7,7 +7,6 @@ import android.view.MenuItem
import android.view.View import android.view.View
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
@ -17,6 +16,7 @@ import io.legado.app.constant.AppConst.charsets
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.constant.IntentAction import io.legado.app.constant.IntentAction
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.BookChapter import io.legado.app.data.entities.BookChapter
@ -41,6 +41,7 @@ import io.legado.app.utils.applyTint
import io.legado.app.utils.checkWrite import io.legado.app.utils.checkWrite
import io.legado.app.utils.cnCompare import io.legado.app.utils.cnCompare
import io.legado.app.utils.enableCustomExport import io.legado.app.utils.enableCustomExport
import io.legado.app.utils.flowWithLifecycleAndDatabaseChange
import io.legado.app.utils.isContentScheme import io.legado.app.utils.isContentScheme
import io.legado.app.utils.observeEvent import io.legado.app.utils.observeEvent
import io.legado.app.utils.parseToUri import io.legado.app.utils.parseToUri
@ -221,7 +222,9 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
else -> booksDownload.sortedByDescending { it.durChapterTime } else -> booksDownload.sortedByDescending { it.durChapterTime }
} }
}.flowWithLifecycle(lifecycle).catch { }.flowWithLifecycleAndDatabaseChange(
lifecycle, table = AppDatabase.BOOK_TABLE_NAME
).catch {
AppLog.put("缓存管理界面获取书籍列表失败\n${it.localizedMessage}", it) AppLog.put("缓存管理界面获取书籍列表失败\n${it.localizedMessage}", it)
}.flowOn(IO).conflate().collect { books -> }.flowOn(IO).conflate().collect { books ->
adapter.setItems(books) adapter.setItems(books)

View File

@ -5,9 +5,10 @@ import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.ProgressBar import android.widget.ProgressBar
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.adapter.DiffRecyclerAdapter
import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.RecyclerAdapter
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.databinding.ItemDownloadBinding import io.legado.app.databinding.ItemDownloadBinding
import io.legado.app.help.book.isLocal import io.legado.app.help.book.isLocal
@ -16,7 +17,20 @@ import io.legado.app.utils.gone
import io.legado.app.utils.visible import io.legado.app.utils.visible
class CacheAdapter(context: Context, private val callBack: CallBack) : class CacheAdapter(context: Context, private val callBack: CallBack) :
RecyclerAdapter<Book, ItemDownloadBinding>(context) { DiffRecyclerAdapter<Book, ItemDownloadBinding>(context) {
override val diffItemCallback: DiffUtil.ItemCallback<Book>
get() = object : DiffUtil.ItemCallback<Book>() {
override fun areItemsTheSame(oldItem: Book, newItem: Book): Boolean {
return oldItem.bookUrl == newItem.bookUrl
}
override fun areContentsTheSame(oldItem: Book, newItem: Book): Boolean {
return oldItem.name == newItem.name
&& oldItem.author == newItem.author
}
}
override fun getViewBinding(parent: ViewGroup): ItemDownloadBinding { override fun getViewBinding(parent: ViewGroup): ItemDownloadBinding {
return ItemDownloadBinding.inflate(inflater, parent, false) return ItemDownloadBinding.inflate(inflater, parent, false)

View File

@ -16,7 +16,6 @@ import androidx.core.os.bundleOf
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.LifecycleRegistry
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
@ -25,6 +24,7 @@ import io.legado.app.R
import io.legado.app.base.VMBaseActivity import io.legado.app.base.VMBaseActivity
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.BookSourcePart import io.legado.app.data.entities.BookSourcePart
import io.legado.app.databinding.ActivityBookSourceBinding import io.legado.app.databinding.ActivityBookSourceBinding
@ -52,7 +52,8 @@ import io.legado.app.utils.ACache
import io.legado.app.utils.applyTint import io.legado.app.utils.applyTint
import io.legado.app.utils.cnCompare import io.legado.app.utils.cnCompare
import io.legado.app.utils.dpToPx import io.legado.app.utils.dpToPx
import io.legado.app.utils.flowWithLifecycleFirst import io.legado.app.utils.flowWithLifecycleAndDatabaseChange
import io.legado.app.utils.flowWithLifecycleAndDatabaseChangeFirst
import io.legado.app.utils.hideSoftInput import io.legado.app.utils.hideSoftInput
import io.legado.app.utils.isAbsUrl import io.legado.app.utils.isAbsUrl
import io.legado.app.utils.launch import io.legado.app.utils.launch
@ -376,7 +377,10 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
else -> data.reversed() else -> data.reversed()
} }
} }
}.flowWithLifecycle(lifecycle).catch { }.flowWithLifecycleAndDatabaseChange(
lifecycle,
table = AppDatabase.BOOK_SOURCE_TABLE_NAME
).catch {
AppLog.put("书源界面更新书源出错", it) AppLog.put("书源界面更新书源出错", it)
}.flowOn(IO).conflate().collect { data -> }.flowOn(IO).conflate().collect { data ->
adapter.setItems(data, adapter.diffItemCallback, !Debug.isChecking) adapter.setItems(data, adapter.diffItemCallback, !Debug.isChecking)
@ -389,8 +393,14 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
private fun initLiveDataGroup() { private fun initLiveDataGroup() {
lifecycleScope.launch { lifecycleScope.launch {
appDb.bookSourceDao.flowGroups() appDb.bookSourceDao.flowGroups()
.flowWithLifecycle(lifecycle) .flowWithLifecycleAndDatabaseChange(
.flowWithLifecycleFirst(groupMenuLifecycleOwner.lifecycle) lifecycle,
table = AppDatabase.BOOK_SOURCE_TABLE_NAME
)
.flowWithLifecycleAndDatabaseChangeFirst(
groupMenuLifecycleOwner.lifecycle,
table = AppDatabase.BOOK_SOURCE_TABLE_NAME
)
.conflate() .conflate()
.distinctUntilChanged() .distinctUntilChanged()
.collect { .collect {

View File

@ -40,6 +40,7 @@ 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.conflate
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -134,6 +135,7 @@ class ExploreFragment() : VMBaseFragment<ExploreViewModel>(R.layout.fragment_exp
AppDatabase.BOOK_SOURCE_TABLE_NAME AppDatabase.BOOK_SOURCE_TABLE_NAME
) )
.conflate() .conflate()
.distinctUntilChanged()
.collect { .collect {
groups.clear() groups.clear()
groups.addAll(it) groups.addAll(it)