行动缓慢的惰性列 Android Compose

47

我用 Jetpack Compose 创建了一个完整的应用。但是在 Lazy Column 上的性能表现非常糟糕,这没有任何意义。 Lazy Column 应该是 RecyclerView 的替代品,但目前来看,RecyclerView 的效果要好得多。

我做了一个带标题的 Lazy ColumnLazy Rows 作为项(基本上是一个嵌套的列表)。正如您所看到的,有图片,但我使用了 Coil 库,所以所有内容都应该在单独的线程中加载。我已经看到了这些讨论:链接1链接2。但似乎这个问题还没有解决,尽管现在 Jetpack Compose 是稳定的。

你们有没有找到更好的性能方法,或者我应该用 RecyclerView 替换这个 Lazy Rows

这里是页面的屏幕截图:

enter image description here

1个回答

77

加速你的懒加载列表的方法

  1. 如果你处于调试模式,这是正常的。不要担心在调试时应用程序卡顿。这是完全正常的。只需以发布模式创建APK(构建 -> 生成已签名的捆绑包/APK),这可能会解决你的问题。这是因为在调试时,Compose会使用JIT在运行时转换字节码。确保在发布构建中也使用R8编译器。这对于改善整体性能非常重要。

  2. 为你的项目设置一个键。像这样初始化你的懒加载列表。

LazyColumn() {
    items(
        count = cartItems.size,
        key = {
            cartItems[it].cartItem.id
        },
        itemContent = { index ->
            val cartItemData = cartItems[index]
            CartItemWithActions(data = cartItemData)
            Divider(
                color = colorResource(id =R.color.separator_line)
            )
        }
    )
}

设置关键字的方式与RecyclerView中的DiffUtil类类似。请查看Maciej Przybylski的帖子
  1. 确保每个变量都使用了remember{}块。
@Composable
fun MyComposable() {
    ...
    val wrongList = myViewModel.getList() // <- Don't do this
    val correctList = remember { myViewModel.getList() } // <- Do this
    ...
}
  1. 你还可以使用contentType,它定义了列表中对象的类型。如果列表中有标题或不同类型的对象,这将非常有用。了解更多信息,请点击这里

  2. 基准配置文件。如果你尝试了一切但列表仍然缺少帧,可能是因为这个原因。在这个讲座中,谷歌工程师Rahul Ravikumar揭示了基准配置文件如何提高性能达40%。这是什么意思?Compose是一个库,而不是本地XML。这意味着每次执行应用程序时,代码都必须在运行时进行翻译。您可以在安装应用程序时使用基准配置文件预先执行和保存所有这些代码。请查看以下链接:基准配置文件使用基准配置文件提高性能

检查这些资源,以免再次出现性能问题。我强烈建议观看以下视频:优化 Jetpack Compose 的渲染性能, Jetpack Compose 的性能最佳实践,并阅读这篇文章

一个好消息

一般来说,与 XML 相比,Jetpack Compose 在性能方面表现不佳。我们现在知道这个问题是由于 Modifiers 的创建方式所造成的。我强烈建议您观看这个视频。好消息是,Jetpack Compose 团队已经花了几个月时间研究一种改进性能的新方法。这种新方法利用了Modifier.Node的使用,避免在底层执行大量无用的操作。这种方法最好的地方是,您不需要更改代码,并且它完全向后兼容。

从 Jetpack Compose 1.5.0 开始可用

原始答案

问题解决了!在阅读这个reddit后,我发现问题只存在于调试版本中。听起来很疯狂,但事实如此。这是因为 Compose 应用的调试版本在内部有很多操作,影响性能(与 Flutter 发生的情况非常相似)。要解决这个问题,你需要做的唯一一件事就是创建一个发布版本的应用。要做到这一点,进入构建 -> 生成已签名的捆绑包/APK。创建密钥,然后选择发布

享受你的流畅应用吧!


3
请考虑观看 https://www.youtube.com/watch?v=Ry-3xlElUe4,其中包含了很多有关如何优化compose应用程序的重要信息(包括你从Reddit上发现的信息)。 - chuckj
是的,我看到了。非常有用! - Mattia Ferigutti
1
无法与Compose 1.4.0-alpha02一起使用。行为仍然迟缓。 - t0m
我也遇到了同样的问题,在执行“Build -> Generated Signed Bundle/APK”之后问题得到了解决,所以应用程序只在调试模式下出现延迟。 - undefined
我不需要构建一个apk来获得更好的性能。只需将构建变体设置为发布版本,就可以解决我的性能问题。 - undefined
谢谢这个建议,添加countkey对我的性能提升真的很有帮助。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接