android - 有没有办法在幕后工作以防止 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)
}
}
}
解决方案
避免 ANR 的最好方法是使用 Thread。您可以在下面详细了解线程的使用情况: https ://developer.android.com/guide/background/threading?hl=en
推荐阅读
- linux-kernel - 为什么在 qemu-system-x86_64 上启动 linux 时需要将控制台设置为 ttyS0
- composer-php - Laragon 定义外部 Composer 路径
- java - 如何在java中仅使用不为空的文本字段
- html - 在html css中对齐文本和切换按钮
- node.js - 服务器不加载数据
- php - 文件上传 CURL 命令到 PHP Curl
- installation - 无法接受来自 Pycharm 在 Raspberry Pi 上的隐私政策
- swift - 在使用 UIKit for macOS (Catalyst) 构建的应用程序中生成进程
- c# - SQL 事务死锁。不知道为什么
- flutter - 应用帮助和教程实现