【问题标题】:Can I shorten the room insertion time using RxJava?我可以使用 RxJava 缩短房间插入时间吗?
【发布时间】:2021-08-18 00:53:06
【问题描述】:

我正在开发一个安卓应用程序。我很难编写将待办事项列表添加到日历的代码。让我先给你看代码。

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)
    }
}

这是插入用户通过TodoDao创建的Todo的代码,并将值插入CalendarDao从今天到Date.END_OF_DAY(我随机指定这个值为“2025年12月31日”) .但是通过CalendarDao 的插入速度非常慢。在 UI 上没有什么不便,但是如果用户在插入过程中从任务中完全终止了应用程序,它将在没有插入数据的情况下终止,直到结束。据说使用RxJava可以解决这个问题,请问怎么解决呢?即使不是RxJava,如果有办法解决这个问题,请告诉我。

【问题讨论】:

  • 你为什么要这样做?也许最好考虑仅使用开始日期和(可选)结束日期来保存项目 - 并调整查询以相应地返回数据。如果您每天都将相同的项目保存到数据库中,尤其是在移动设备上,您的用户将不会很高兴,因为他们的设备空间不足。如果他们决定更改标题会怎样?还是开始/结束日期?我认为即使对你自己和未来的维护者来说,你也让这件事变得非常复杂。

标签: android rx-java android-room kotlin-coroutines


【解决方案1】:

Dispatchers.Default 更改为Dispatchers.IO

这是一个数据库操作,它应该在 IO 线程上处理,Default 是一个真正的重型 CPU 线程。

使用RxJava 是标准化数据库交互的好方法,它允许您远离 UI 线程并设置观察者模式,以便您在获取数据时对数据做出反应,而不是等待它。

如果他们在执行此操作时关闭了应用程序,那么您无能为力,因为这是在 1 个事务下处理的。因此,对数据库的实际更改仅在最后处理,这意味着如果操作未完成,则不会插入任何内容。但是你也不想一次做这 1 笔交易,因为那非常慢。这是一个可靠性与速度的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多