java - 有没有办法在 Android 应用程序中有效地进行大量计算工作?
问题描述
在构建待办事项列表应用程序时,我想向用户展示统计数据。用户创建的待办事项列表存储在房间数据库中。为了显示用户完成待办事项的难度的统计数据,计算了多年来的待办事项完成次数,但该应用程序开始出现问题。甚至计算过程都在使用 CoroutineScope(Dispatchers.Default)。我觉得应用程序变慢了,因为我使用如下代码来计算数组中的值。
runBlocking {
withContext(CoroutineScope(Dispatchers.Default).coroutineContext) {
var total = 0
val todoDao = MyDatabase.getInstance(mContext).getTodoDao()
val todos = todoDao.getTodos()
for (i in todos) {
if (i.user_done) {
total++
}
}
}
}
findViewById(R.id.total).text = total.toString()
上面的代码是呈现给用户的统计计算过程的一部分。如何更高效地进行大量计算,例如在打开应用程序时,根据用户的操作进行预计算和重新计算?
解决方案
我不太使用 Kotlin,但如果它阻塞了主线程,runBlocking 是一种降低应用程序速度的可靠方法。如果是这种情况,Room 可以选择强制它离开 UI 线程,因此如果在 UI 线程上运行某些内容,它将抛出异常。
另一个问题可能是内存 val todos 有多大?如果 todos 是大量对象,那么您将它们全部放在 RAM 中(这可能会很快失控)。如果是这样考虑批处理,通过拉出有限的数量并抵消以拉下一个限制,因此您在任何给定时间都只有有限数量的对象,GC 不会讨厌您。
(编辑)我讨厌在答案中添加一个库,但研究 RxJava for Kotlin 可能是一个真正的游戏规则改变者,当涉及到这些问题时,它为我创造了奇迹。
推荐阅读
- c++ - 支配 n 皇后谜题
- flutter - 在 Flutter 中对齐行内的列
- javascript - FirebaseError:[code=unknown]:获取身份验证令牌失败:无法重新定义属性:refreshToken
- c# - C# .NET Core websocket ssl 问题 - dh 密钥太小
- javascript - 如何在 Django 上制作印章/徽章/小部件
- jenkins - 如何在 zip 文件中下载所有 Jenkins 工作区(带有 .git 文件夹)?
- ios - iOS Swift UIView 动画跳回到开头
- java - 二进制 XML 文件第 21 行:二进制 XML 文件第 21 行:膨胀类 com.google.android.material.textfield.TextInputLayout 时出错
- javascript - 如何用另一个数组的元素替换数组中的特定关键元素
- r - 在 R 中格式化日期,年份中不带零