首页 > 解决方案 > 我可以使用 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,如果有办法解决这个问题,请告诉我。

标签: androidrx-javaandroid-roomkotlin-coroutines

解决方案


更改 Dispatchers.DefaultDispatchers.IO

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

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

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


推荐阅读