首页 > 解决方案 > 有没有办法在幕后工作以防止 ANR 在 Android 中长时间工作?

问题描述

在创建日历应用程序时,我们将能够向用户添加事件。如果用户添加日程,日程是从同一天添加到 2100 年 12 月 31 日。我正在使用Room数据库。这是我尝试的方法:

fun add() {
    val today = Calendar.getInstance()
    val next = today.clone() as Calendar
    next.time = SimpleDateFormat("yyyy/MM/dd", Locale.getDefault()).parse("2100/12/31")

    CoroutineScrop(Dispatchers.Default).lanch {
        while (today.timeInMillis <= next.timeInMillis) {
            ... insert code

            today.add(Calendar.DAY_OF_MONTH, 1)
        }
    }
}

然而,即使有CoroutineScope上述情况,手机屏幕冻结大约 15 秒也需要相当长的时间。所以,这一次,我实现了 Service 以便它可以在后台工作。

class AddService: Service() {
    ...

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

        add()

        return super.onStartCommand(intent, flags, startId)
    }
}

不过,这也花了很长时间。事实上,我认为从 2021 年 5 月 20 日到 2100 年 12 月 31 日,每天的日程安排不会花更少的时间。至少,我想实现屏幕上显示的 UI,这样不会不舒服用户。如何实现在不影响 UI 的情况下继续在后台运行的代码?

[编辑]

fun add() {
    val today = Calendar.getInstance()
    val next = today.clone() as Calendar
    next.time = SimpleDateFormat("yyyy/MM/dd", Locale.getDefault()).parse("2100/12/31")

    CoroutineScrop(Dispatchers.Default).lanch {
        while (today.timeInMillis <= next.timeInMillis) {
            val data = MyData(today.timeInMillis)
            MyRoomDatabase.getInstance(this@MainActivity).getDataDao().insert(data)

            today.add(Calendar.DAY_OF_MONTH, 1)
        }
    }
}

标签: androidbackgroundandroid-serviceandroid-room

解决方案


避免 ANR 的最好方法是使用 Thread。您可以在下面详细了解线程的使用情况: https ://developer.android.com/guide/background/threading?hl=en


推荐阅读