首页 > 解决方案 > 有没有办法在 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()

上面的代码是呈现给用户的统计计算过程的一部分。如何更高效地进行大量计算,例如在打开应用程序时,根据用户的操作进行预计算和重新计算?

标签: javaandroidkotlin

解决方案


我不太使用 Kotlin,但如果它阻塞了主线程,runBlocking 是一种降低应用程序速度的可靠方法。如果是这种情况,Room 可以选择强制它离开 UI 线程,因此如果在 UI 线程上运行某些内容,它将抛出异常。

另一个问题可能是内存 val todos 有多大?如果 todos 是大量对象,那么您将它们全部放在 RAM 中(这可能会很快失控)。如果是这样考虑批处理,通过拉出有限的数量并抵消以拉下一个限制,因此您在任何给定时间都只有有限数量的对象,GC 不会讨厌您。

(编辑)我讨厌在答案中添加一个库,但研究 RxJava for Kotlin 可能是一个真正的游戏规则改变者,当涉及到这些问题时,它为我创造了奇迹。


推荐阅读