diff --git a/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt b/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt index 73bd5e88a..09867c9b9 100644 --- a/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt @@ -10,7 +10,9 @@ import io.legado.app.constant.AppPattern import io.legado.app.data.entities.ReplaceRule import io.legado.app.utils.cnCompare import io.legado.app.utils.splitNotBlank +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map @@ -107,6 +109,6 @@ interface ReplaceRuleDao { fun flowGroups(): Flow> { return flowGroupsUnProcessed().map { list -> dealGroups(list) - } + }.flowOn(IO) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt b/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt index 28f54154c..017e7ec8a 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt @@ -1,11 +1,18 @@ package io.legado.app.data.dao -import androidx.room.* +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Update import io.legado.app.constant.AppPattern import io.legado.app.data.entities.RssSource import io.legado.app.utils.cnCompare import io.legado.app.utils.splitNotBlank +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map @Dao @@ -133,6 +140,6 @@ interface RssSourceDao { fun flowGroups(): Flow> { return flowGroupsUnProcessed().map { list -> dealGroups(list) - } + }.flowOn(IO) } } diff --git a/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkActivity.kt b/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkActivity.kt index 5f4883d30..aa5004c1a 100644 --- a/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkActivity.kt @@ -7,6 +7,7 @@ import androidx.activity.viewModels import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.Bookmark import io.legado.app.databinding.ActivityAllBookmarkBinding @@ -14,9 +15,13 @@ import io.legado.app.ui.file.HandleFileContract import io.legado.app.utils.showDialogFragment import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch +/** + * 所有书签 + */ class AllBookmarkActivity : VMBaseActivity(), BookmarkAdapter.Callback { @@ -37,7 +42,9 @@ class AllBookmarkActivity : VMBaseActivity() else -> booksDownload.sortedByDescending { it.durChapterTime } } - }.conflate().collect { books -> + }.catch { + AppLog.put("缓存管理界面获取书籍列表失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { books -> adapter.setItems(books) viewModel.loadCacheFiles(books) } @@ -228,7 +232,9 @@ class CacheActivity : VMBaseActivity() @SuppressLint("NotifyDataSetChanged") private fun initGroupData() { lifecycleScope.launch { - appDb.bookGroupDao.flowAll().conflate().collect { + appDb.bookGroupDao.flowAll().catch { + AppLog.put("缓存管理界面获取分组数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { groupList.clear() groupList.addAll(it) adapter.notifyDataSetChanged() diff --git a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt index 23ec1a0d2..d9da7b212 100644 --- a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt @@ -15,6 +15,9 @@ import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding +/** + * 发现列表 + */ class ExploreShowActivity : VMBaseActivity(), ExploreShowAdapter.CallBack { override val binding by viewBinding(ActivityExploreShowBinding::inflate) diff --git a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowViewModel.kt b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowViewModel.kt index 02747ea32..47b2d018d 100644 --- a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowViewModel.kt @@ -15,6 +15,7 @@ import io.legado.app.utils.printOnDebug import io.legado.app.utils.stackTraceStr import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.mapLatest import java.util.concurrent.ConcurrentHashMap @@ -38,6 +39,8 @@ class ExploreShowViewModel(application: Application) : BaseViewModel(application keys.add(it.name) } keys + }.catch { + AppLog.put("发现列表界面获取书籍数据失败\n${it.localizedMessage}", it) }.collect { bookshelf.clear() bookshelf.addAll(it) diff --git a/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt index 029f29e4a..0cff59e78 100644 --- a/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/group/GroupManageDialog.kt @@ -15,6 +15,7 @@ import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.BookGroup import io.legado.app.databinding.DialogRecyclerViewBinding @@ -30,10 +31,15 @@ import io.legado.app.utils.showDialogFragment import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch - +/** + * 书籍分组管理 + */ class GroupManageDialog : BaseDialogFragment(R.layout.dialog_recycler_view), Toolbar.OnMenuItemClickListener { @@ -70,7 +76,9 @@ class GroupManageDialog : BaseDialogFragment(R.layout.dialog_recycler_view), private fun initData() { lifecycleScope.launch { - appDb.bookGroupDao.flowAll().conflate().collect { + appDb.bookGroupDao.flowAll().catch { + AppLog.put("书籍分组管理界面获取分组数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { adapter.setItems(it) } } diff --git a/app/src/main/java/io/legado/app/ui/book/import/remote/ServersDialog.kt b/app/src/main/java/io/legado/app/ui/book/import/remote/ServersDialog.kt index fea16d0f2..519e99904 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/remote/ServersDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/remote/ServersDialog.kt @@ -15,6 +15,7 @@ import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.constant.AppConst.DEFAULT_WEBDAV_ID +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.Server import io.legado.app.databinding.DialogRecyclerViewBinding @@ -29,8 +30,14 @@ import io.legado.app.utils.setLayout import io.legado.app.utils.showDialogFragment import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch +/** + * 服务器配置 + */ class ServersDialog : BaseDialogFragment(R.layout.dialog_recycler_view), Toolbar.OnMenuItemClickListener { @@ -79,7 +86,9 @@ class ServersDialog : BaseDialogFragment(R.layout.dialog_recycler_view), private fun initData() { lifecycleScope.launch { - appDb.serverDao.observeAll().collect { + appDb.serverDao.observeAll().catch { + AppLog.put("服务器配置界面获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).collect { adapter.setItems(it) } } diff --git a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt index 0d85ed18f..d0f564d8c 100644 --- a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt @@ -16,6 +16,7 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookGroup @@ -51,6 +52,7 @@ import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map @@ -58,7 +60,9 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlin.math.max - +/** + * 书架管理 + */ class BookshelfManageActivity : VMBaseActivity(), PopupMenu.OnMenuItemClickListener, @@ -216,7 +220,9 @@ class BookshelfManageActivity : @SuppressLint("NotifyDataSetChanged") private fun initGroupData() { lifecycleScope.launch { - appDb.bookGroupDao.flowAll().conflate().collect { + appDb.bookGroupDao.flowAll().catch { + AppLog.put("书架管理界面获取分组数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { groupList.clear() groupList.addAll(it) adapter.notifyDataSetChanged() @@ -251,6 +257,8 @@ class BookshelfManageActivity : it.durChapterTime } } + }.catch { + AppLog.put("书架管理界面获取书籍列表失败\n${it.localizedMessage}", it) }.flowOn(IO) .conflate().collect { books = it diff --git a/app/src/main/java/io/legado/app/ui/book/manage/SourcePickerDialog.kt b/app/src/main/java/io/legado/app/ui/book/manage/SourcePickerDialog.kt index 7b273bd44..07650faea 100644 --- a/app/src/main/java/io/legado/app/ui/book/manage/SourcePickerDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/SourcePickerDialog.kt @@ -14,6 +14,7 @@ import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.BookSourcePart @@ -27,10 +28,16 @@ import io.legado.app.utils.applyTint import io.legado.app.utils.dpToPx import io.legado.app.utils.setLayout import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch import splitties.views.onClick +/** + * 书源选择 + */ class SourcePickerDialog : BaseDialogFragment(R.layout.dialog_source_picker), Toolbar.OnMenuItemClickListener { @@ -85,7 +92,9 @@ class SourcePickerDialog : BaseDialogFragment(R.layout.dialog_source_picker), when { searchKey.isNullOrEmpty() -> appDb.bookSourceDao.flowEnabled() else -> appDb.bookSourceDao.flowSearchEnabled(searchKey) - }.collect { + }.catch { + AppLog.put("书源选择界面获取书源数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).collect { adapter.setItems(it) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt index 2918c1cc4..e3cf4f23f 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt @@ -14,6 +14,7 @@ import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.HttpTTS import io.legado.app.databinding.DialogEditTextBinding @@ -44,7 +45,10 @@ import io.legado.app.utils.splitNotBlank import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch /** @@ -163,7 +167,9 @@ class SpeakEngineDialog(val callBack: CallBack) : BaseDialogFragment(R.layout.di private fun initData() { lifecycleScope.launch { - appDb.httpTTSDao.flowAll().conflate().collect { + appDb.httpTTSDao.flowAll().catch { + AppLog.put("朗读引擎界面获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { adapter.setItems(it) } } diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt index 3220c67f2..294d040a5 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt @@ -17,6 +17,7 @@ import androidx.recyclerview.widget.RecyclerView import com.google.android.flexbox.FlexboxLayoutManager import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.constant.AppLog import io.legado.app.constant.PreferKey import io.legado.app.data.appDb import io.legado.app.data.entities.Book @@ -44,7 +45,9 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import splitties.init.appCtx @@ -347,7 +350,9 @@ class SearchActivity : VMBaseActivity appDb.searchKeywordDao.flowByTime() else -> appDb.searchKeywordDao.flowSearch(key) - }.conflate().collect { + }.catch { + AppLog.put("搜索界面获取搜索历史数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { historyKeyAdapter.setItems(it) if (it.isEmpty()) { binding.tvClearHistory.invisible() diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt index a6df01d8f..befd44c37 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchViewModel.kt @@ -15,6 +15,7 @@ import io.legado.app.model.webBook.SearchModel import io.legado.app.utils.ConflateLiveData import io.legado.app.utils.toastOnUi import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.mapLatest import java.util.concurrent.ConcurrentHashMap @@ -66,6 +67,8 @@ class SearchViewModel(application: Application) : BaseViewModel(application) { keys.add(it.name) } keys + }.catch { + AppLog.put("搜索界面获取书籍列表失败\n${it.localizedMessage}", it) }.collect { bookshelf.clear() bookshelf.addAll(it) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt index c023a4676..a69b2669a 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt @@ -8,6 +8,7 @@ import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.base.VMBaseFragment +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.Bookmark import io.legado.app.databinding.FragmentBookmarkBinding @@ -19,6 +20,9 @@ import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.showDialogFragment import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -54,7 +58,9 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_bookmark when { searchKey.isNullOrBlank() -> appDb.bookmarkDao.flowByBook(book.name, book.author) else -> appDb.bookmarkDao.flowSearch(book.name, book.author, searchKey) - }.collect { + }.catch { + AppLog.put("目录界面获取书签数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).collect { adapter.setItems(it) var scrollPos = 0 withContext(Dispatchers.Default) { diff --git a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt index b803960eb..c078741b1 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt @@ -10,6 +10,7 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ItemTouchHelper import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.TxtTocRule import io.legado.app.databinding.ActivityTxtTocRuleBinding @@ -25,9 +26,21 @@ import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.* +import io.legado.app.utils.ACache +import io.legado.app.utils.GSON +import io.legado.app.utils.isAbsUrl +import io.legado.app.utils.launch +import io.legado.app.utils.readText +import io.legado.app.utils.sendToClip +import io.legado.app.utils.setEdgeEffectColor +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.splitNotBlank +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch class TxtTocRuleActivity : VMBaseActivity(), @@ -103,7 +116,9 @@ class TxtTocRuleActivity : VMBaseActivity + appDb.txtTocRuleDao.observeAll().catch { + AppLog.put("TXT目录规则界面获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { tocRules -> adapter.setItems(tocRules, adapter.diffItemCallBack) upCountView() } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt index 4cf25dc9f..ff0165f5d 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt @@ -17,6 +17,7 @@ import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.TxtTocRule import io.legado.app.databinding.DialogEditTextBinding @@ -31,9 +32,19 @@ import io.legado.app.ui.qrcode.QrCodeResult import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.* +import io.legado.app.utils.ACache +import io.legado.app.utils.applyTint +import io.legado.app.utils.launch +import io.legado.app.utils.readText +import io.legado.app.utils.setLayout +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.splitNotBlank +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch /** @@ -108,7 +119,9 @@ class TxtTocRuleDialog() : BaseDialogFragment(R.layout.dialog_toc_regex), private fun initData() { lifecycleScope.launch { - appDb.txtTocRuleDao.observeAll().conflate().collect { tocRules -> + appDb.txtTocRuleDao.observeAll().catch { + AppLog.put("TXT目录规则对话框获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { tocRules -> initSelectedName(tocRules) adapter.setItems(tocRules, adapter.diffItemCallBack) } diff --git a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleActivity.kt b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleActivity.kt index 50d5c2900..6374c49df 100644 --- a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleActivity.kt @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.DictRule import io.legado.app.databinding.ActivityDictRuleBinding @@ -26,8 +27,20 @@ import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.* +import io.legado.app.utils.ACache +import io.legado.app.utils.GSON +import io.legado.app.utils.isAbsUrl +import io.legado.app.utils.launch +import io.legado.app.utils.readText +import io.legado.app.utils.sendToClip +import io.legado.app.utils.setEdgeEffectColor +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.splitNotBlank +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch class DictRuleActivity : VMBaseActivity(), @@ -112,7 +125,9 @@ class DictRuleActivity : VMBaseActivity(R.layout.fragment_rss), else -> appDb.rssSourceDao.flowEnabled(searchKey) }.catch { AppLog.put("订阅界面更新数据出错", it) - }.collect { + }.flowOn(IO).collect { adapter.setItems(it) } } diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt index f1d59ff7e..996ccf52c 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt @@ -37,12 +37,25 @@ import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.* +import io.legado.app.utils.ACache +import io.legado.app.utils.GSON +import io.legado.app.utils.applyTint +import io.legado.app.utils.hideSoftInput +import io.legado.app.utils.isAbsUrl +import io.legado.app.utils.launch +import io.legado.app.utils.readText +import io.legado.app.utils.sendToClip +import io.legado.app.utils.setEdgeEffectColor +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.splitNotBlank +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch /** @@ -209,7 +222,7 @@ class ReplaceRuleActivity : VMBaseActivity(R.layout.fragment_rss_articles), @@ -99,7 +103,9 @@ class RssArticlesFragment() : VMBaseFragment(R.layout.frag val rssUrl = activityViewModel.url ?: return articlesFlowJob?.cancel() articlesFlowJob = lifecycleScope.launch { - appDb.rssArticleDao.flowByOriginSort(rssUrl, viewModel.sortName).collect { + appDb.rssArticleDao.flowByOriginSort(rssUrl, viewModel.sortName).catch { + AppLog.put("订阅文章界面获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).collect { adapter.setItems(it) } } diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt index 5ede8362a..d1f1a3591 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import io.legado.app.base.BaseActivity +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.RssStar import io.legado.app.databinding.ActivityRssFavoritesBinding @@ -12,10 +13,15 @@ import io.legado.app.ui.rss.read.ReadRssActivity import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch - +/** + * 收藏夹 + */ class RssFavoritesActivity : BaseActivity(), RssFavoritesAdapter.CallBack { @@ -38,7 +44,9 @@ class RssFavoritesActivity : BaseActivity(), private fun initData() { lifecycleScope.launch { - appDb.rssStarDao.liveAll().conflate().collect { + appDb.rssStarDao.liveAll().catch { + AppLog.put("订阅收藏夹界面获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { adapter.setItems(it) } } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt index 1960bb8d5..e39d075e7 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt @@ -32,12 +32,28 @@ import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.* +import io.legado.app.utils.ACache +import io.legado.app.utils.applyTint +import io.legado.app.utils.cnCompare +import io.legado.app.utils.dpToPx +import io.legado.app.utils.hideSoftInput +import io.legado.app.utils.isAbsUrl +import io.legado.app.utils.launch +import io.legado.app.utils.readText +import io.legado.app.utils.sendToClip +import io.legado.app.utils.setEdgeEffectColor +import io.legado.app.utils.share +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.splitNotBlank +import io.legado.app.utils.startActivity +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch /** @@ -331,7 +347,7 @@ class RssSourceActivity : VMBaseActivity(), private fun initData() { lifecycleScope.launch { - appDb.ruleSubDao.flowAll().conflate().collect { + appDb.ruleSubDao.flowAll().catch { + AppLog.put("规则订阅界面获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).conflate().collect { binding.tvEmptyMsg.isGone = it.isNotEmpty() adapter.setItems(it) } diff --git a/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardAssistsConfig.kt b/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardAssistsConfig.kt index b87a5ccf5..720cd8ceb 100644 --- a/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardAssistsConfig.kt +++ b/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardAssistsConfig.kt @@ -15,6 +15,7 @@ import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.KeyboardAssist import io.legado.app.databinding.DialogMultipleEditTextBinding @@ -31,8 +32,13 @@ import io.legado.app.utils.setLayout import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch +/** + * 辅助按键配置 + */ class KeyboardAssistsConfig : BaseDialogFragment(R.layout.dialog_recycler_view), Toolbar.OnMenuItemClickListener { @@ -70,7 +76,9 @@ class KeyboardAssistsConfig : BaseDialogFragment(R.layout.dialog_recycler_view), private fun initData() { lifecycleScope.launch { - appDb.keyboardAssistsDao.flowAll.collect { + appDb.keyboardAssistsDao.flowAll.catch { + AppLog.put("辅助按键配置获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).collect { adapter.setItems(it) } } diff --git a/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt b/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt index 2656ef0c5..d5d422cf3 100644 --- a/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt +++ b/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt @@ -2,11 +2,17 @@ package io.legado.app.ui.widget.keyboard import android.content.Context import android.graphics.Rect -import android.view.* +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.ViewTreeObserver +import android.view.Window import android.widget.PopupWindow import io.legado.app.R import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.RecyclerAdapter +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.KeyboardAssist import io.legado.app.databinding.ItemFilletTextBinding @@ -17,6 +23,9 @@ import io.legado.app.utils.activity import io.legado.app.utils.showDialogFragment import io.legado.app.utils.windowSize import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch import splitties.systemservices.layoutInflater import splitties.systemservices.windowManager @@ -95,7 +104,9 @@ class KeyboardToolPop( @Suppress("MemberVisibilityCanBePrivate") fun upAdapterData() { scope.launch { - appDb.keyboardAssistsDao.flowByType(0).collect { + appDb.keyboardAssistsDao.flowByType(0).catch { + AppLog.put("键盘帮助浮窗获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).collect { adapter.setItems(it) } }