我注意到(我知道在调试模式下测试不太好)我的应用程序滚动非常缓慢,然后我查看布局检查器并尝试计算重组。例如,我看到一些帖子重组发生5次甚至8次。这真的会严重影响我的应用程序性能吗?以下图片显示了布局检查器
qpgpyjmq1#
这取决于你期望的重组计数应该是多少。重组本身并不坏,事实上它是必要的更新UI。但不应进行不必要的重新组合,因为这将对性能不利。从你的截图中很难说这些数字是否很高。例如,第一次进入特定屏幕后的截图,可能5看起来很高,但这同样取决于你的特定代码和你在这个特定屏幕中预期的重组次数。我试着自己做一个逻辑计算,大概计算出我对一个特定的关键UI元素(比如一个列表等)的预期重组次数,然后与布局检查器进行比较。如果布局检查器中的计数比我预期的要高得多,那么在很多情况下,我的代码在UI更新方面并不是最优的。Jetpack编写中列表需要注意一个具体性能问题,在Composable函数中加载列表数据时需要小心,假设您希望从ViewModel中加载数据库数据,ViewModel使用协程调用Repository中的数据库加载,并且您希望将此数据加载到Composable函数中。在这里,您应该使用SideEffects来确保数据只加载一次,而不是在重组时加载(如果数据没有更改)。
//empty defined elsewhere val myData by produceState(initialValue = empty) { viewModel.getData().observe(lifeCycleOwner) { value = it } }
有关详细信息,请参阅文档。
1条答案
按热度按时间qpgpyjmq1#
这取决于你期望的重组计数应该是多少。重组本身并不坏,事实上它是必要的更新UI。
但不应进行不必要的重新组合,因为这将对性能不利。
从你的截图中很难说这些数字是否很高。例如,第一次进入特定屏幕后的截图,可能5看起来很高,但这同样取决于你的特定代码和你在这个特定屏幕中预期的重组次数。
我试着自己做一个逻辑计算,大概计算出我对一个特定的关键UI元素(比如一个列表等)的预期重组次数,然后与布局检查器进行比较。如果布局检查器中的计数比我预期的要高得多,那么在很多情况下,我的代码在UI更新方面并不是最优的。
Jetpack编写中列表需要注意一个具体性能问题,在Composable函数中加载列表数据时需要小心,假设您希望从ViewModel中加载数据库数据,ViewModel使用协程调用Repository中的数据库加载,并且您希望将此数据加载到Composable函数中。在这里,您应该使用SideEffects来确保数据只加载一次,而不是在重组时加载(如果数据没有更改)。
有关详细信息,请参阅文档。