android - 我可以使用 RxJava 缩短房间插入时间吗?
问题描述
我正在开发一个安卓应用程序。我很难编写将待办事项列表添加到日历的代码。我先给你看一下代码。
private fun addTodoList(entity: MyTodo) {
val start = Calendar.getInstance()
val end = start.clone() as Calendar
end.time = SimpleDateFormat("MM dd, yyyy", Locale.getDefault()).parse(Date.END_OF_DAY)!!
CoroutineScope(Dispatchers.Default).launch {
val id = MyDatabase.getInstance(mContext).getTodoDao().insert(entity)
val dao = MyDatabase.getInstance(mContext).getCalendarDao()
do {
val date = ymd.format(start.timeInMillis)
val item = CalendarEntity(date, id.toInt())
dao.insert(item)
start.add(Calendar.DAY_OF_MONTH, 1)
} while (start.timeInMillis <= end.timeInMillis)
}
}
这是将Todo
用户创建的通过插入的代码,并将TodoDao
值插入CalendarDao
从今天到Date.END_OF_DAY
(我随机将此值指定为“2025 年 12 月 31 日”)。但是插入速度CalendarDao
很慢。在 UI 上没有什么不便,但是如果用户在插入过程中从任务中完全终止了应用程序,它将在没有插入数据的情况下终止,直到结束。据说使用RxJava
可以解决这个问题,请问怎么解决呢?即使不是RxJava
,如果有办法解决这个问题,请告诉我。
解决方案
更改 Dispatchers.Default
为 Dispatchers.IO
这是一个数据库操作,它应该在一个IO
线程上处理,Default
是一个真正的重型 CPU 线程。
UsingRxJava
是一种标准化数据库交互的好方法,它允许您远离 UI 线程并设置一个观察者模式,以允许您在获取数据时对数据做出反应,而不是等待它。
如果他们在此操作发生时关闭了应用程序,那么您无能为力,因为这是在 1 个事务下处理的。因此,对数据库的实际更改仅在最后处理,这意味着如果操作未完成,则不会插入任何内容。但是你也不想一次做这 1 笔交易,因为那非常慢。这是一个可靠性与速度的问题。
推荐阅读
- javascript - 您可以使用变量,但也可以在闭包中本地重新声明它吗?
- css - ClojureScript 中未显示 CSS 属性
- swift - 由于“内部”保护级别, Swift Generics 'Event ' 初始化程序不可访问
- kentico-kontent - 如何从 Kentico Kontent(又名 Kentico Cloud)API 中检索工作流日期
- react-native - 从反应 NavigationContainer 调用时组件不加载
- javascript - React,如何在字符串中动态创建组件?
- javascript - 制作一个在鼠标滚动时滑动的轮播
- javascript - 使用 Chart.js 的多轴折线图
- ios - 是否可以为 CupertinoTabScaffold 的选项卡之间的过渡设置动画?
- flutter - 无法使用 image_picker 从画廊加载图像在 Flutter 中失败