Laggy Lazy Column Android Compose

2023-12-27

我已经创建了一个完整的应用程序Jetpack 组合。然而,现场的表演Lazy Column非常糟糕,而且没有任何意义。Lazy Column应该是替代RecyclerView, but RecyclerView目前效果好多了。

我制造了一个Lazy Column带有标题和Lazy Rows作为项目(基本上是一个嵌套列表)。正如你所看到的,有图像,但我使用了线圈库所以所有的东西都应该加载在一个单独的线程中。我已经看过这些讨论:link1 https://www.reddit.com/r/androiddev/comments/n61qxh/jetpack_compose_lazycolumn_laggy/, link2 https://stackoverflow.com/questions/69856439/lazycolumn-is-slower-than-column-with-vertical-scroll。但这个问题似乎还没有解决办法,尽管现在Jetpack 组合是稳定的。

你们中有人找到了获得更好表现的方法吗?或者我应该用这个来代替Lazy Rows with a RecyclerView?

这是页面的屏幕:


事情会加速你的懒惰清单

  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)
            )
        }
    )
}

设置密钥的工作方式类似于DiffUtil班级在RecyclerView。检查Maciej Przybylski 的帖子 https://stackoverflow.com/questions/69856439/lazycolumn-is-slower-than-column-with-vertical-scroll.

  1. 确保每个变量都使用remember{} block.
@Composable
fun MyComposable() {
    ...
    val wrongList = myViewModel.getList() // <- Don't do this
    val correctList = remember { myViewModel.getList() } // <- Do this
    ...
}
  1. 您还可以使用contentType,它定义列表中对象的类型。如果列表中有标题或不同类型的对象,这非常有用。了解更多here https://developer.android.com/reference/kotlin/androidx/compose/foundation/lazy/LazyListScope.

  2. 基线配置文件。如果您已经尝试了所有方法,但您的列表仍然缺少帧,则可能是这样。在这个talk https://www.droidcon.com/2022/06/28/making-apps-blazing-fast-with-baseline-profiles/, Rahul Ravikumar(Google 工程师)揭示了基线配置文件如何将性能提高高达 40%。这是什么? Compose 是一个库,而不是本机 XML。这意味着每次执行应用程序时,都必须在运行时翻译代码。您可以在使用基线配置文件安装应用程序时预执行并保存所有这些代码。检查这些链接:基线配置文件 https://developer.android.com/topic/performance/baselineprofiles, 使用基线配置文件提高性能 https://medium.com/androiddevelopers/improving-performance-with-baseline-profiles-fdd0db0d8cc6.

检查这些资源,再也不会出现性能问题。我强烈建议观看这些视频:优化 Jetpack Compose 的渲染性能 https://youtu.be/Ry-3xlElUe4, Jetpack Compose 的性能最佳实践 https://youtu.be/EOQB8PTLkpY,和阅读这个帖子 https://stackoverflow.com/questions/71807439/how-optimize-jetpack-compose-list-performance.

一个好消息

一般来说,与 XML 相比,Jetpack Compose 的性能并不好。我们现在知道这个问题是由于修饰符的创建方式造成的。我强烈建议你观看这个视频 https://youtu.be/BjGX2RftXsU。好消息是,Jetpack Compose 团队几个月来一直在研究一种提高性能的新方法。这种新方法利用了Modifier.Node以避免在幕后执行大量无用的操作。这种方法最好的一点是,您不需要更改代码中的任何内容,并且它将完全兼容。

可从 Jetpack Compose 获取1.5.0

原答案

解决了!读这篇文章我发现问题只出在调试版本。这看起来很疯狂,但却是事实。这是因为 Compose 应用程序的调试版本在幕后发生了很多事情,这会影响性能(与 Flutter 中发生的情况非常相似)。解决问题你唯一需要做的事是创建应用程序的发布版本。为此,请转至Build -> 生成的签名包/APK。创建密钥,然后选择release.

享受流畅的应用程序吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laggy Lazy Column Android Compose 的相关文章

  • 如何强制 Eclipse 将 xml 布局和样式显示为文本?

    我最近升级到带有 ADT 20 0 3 的 Eclipse 4 2 Juno 如果我查看旧项目中的布局或样式 Eclipse 只会向我显示其适当的基于控件的编辑器 我想编辑语法突出显示的 xml 文本 我没有找到将插件的编辑器切换到此模式的
  • Twitter 登录说明

    我想在 Android 中创建一个 Twitter 应用程序 为此 我想创建一个登录页面并登录到 Twitter 为此 我们需要消费者密钥和消费者密钥 这是什么意思 要创建此登录页面 除了 Twitter 帐户之外 我们还需要其他任何东西吗
  • 在android中通过BLE传输图像

    我使用以下代码传输 1 MB 的图像 如果在每个数据包之间实现线程延迟 则图像将成功传输 如果未设置线程延迟 则所有数据包均从BluetoothGattServer 发送 但BluetoothGattCallback 不会接收所有数据包 任
  • FTS3 在 ORMLite 中搜索?

    我对 FTS3 一无所知 除了http developer android com guide topics search search dialog html http developer android com guide topics
  • Service 和 IntentService,运行从服务器轮询数据库值的服务哪个更好?

    我读过很多关于Service and IntentService 然而 当做出决定时 我没有足够的信心选择使用哪种类型来创建一个后台服务 该服务将在一定时间间隔内从数据库轮询数据 并在获得所需数据时停止它 因为数据代表请求的状态 例如 订购
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 出现错误错误:res/menu/mainMenu.xml:文件名无效:必须仅包含[a-z0-9_。]

    我是安卓新手 刚刚开始使用 我在 res 文件夹中创建了一个文件 menu mainMenu xml 但我得到了错误 Error res menu mainMenu xml invalid file name must contain on
  • android EditText 输入类型用于 StreetNumber 字段

    我试图在地址对话框的 streetNumber 字段中选择正确的 inputType 我想先显示数字键盘 然后让用户输入字母字符 对于一些非常特殊的情况 更接近这个的是 inputType datetime 但这不允许输入字母字符 那么如何
  • AudioTrack、SoundPool 或 MediaPlayer,我应该使用哪个?

    如果我需要能够 播放多个音频文件 具有不同的持续时间 例如 5 到 30 秒 独立设置右 左声道的音量 应用声音效果 如混响 失真 那么 我应该使用哪个 API 另外 我在 AudioTrack API 上找不到太多文档 有谁知道在哪里可以
  • Camera.open()返回NULL Android开发

    我正在按照构建相机应用程序的教程进行操作http developer android com tools device html http developer android com tools device html我对 Camera o
  • Android 服务是否有办法检测设备何时锁定?

    我有一个 Android 服务 我希望在设备锁定时执行操作 我想澄清一下 我对屏幕开 关状态不感兴趣 我知道如何使用带有 Intent ACTION USER PRESENT 和 KeyguardManager inKeyguardRest
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • PhoneStateListener 不调用

    这是我的完整代码 广播示例 java package com example broadcast gt import android app Activity import gt android content Context import
  • HERE 地图:更改路线已行驶部分的颜色

    导航时可以改变路线的颜色吗 具体来说 我希望路线中已行驶的部分的颜色与即将行驶的部分的颜色不同 现在都是同一个颜色 将 MapRoute 对象的 TravelColor 变量设置为透明对我来说很有效 mapRoute color Resou
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 在 KitKat 4.4.2 中获取 SDard 路径和大小

    我在 Google Play 上有一个设备信息应用程序 在该应用程序中我有存储信息 我知道 Android 4 4 在访问外部 SD 卡方面发生了一些变化 内部似乎没有给我带来问题 我的问题是 如何可靠地获取 KitKat 上 SD 卡的大
  • 使用 JobScheduler API 进行位置更新

    下面是我使用 FireBaseJobDispatcher 启动作业的演示代码 public class MainActivity extends AppCompatActivity Override protected void onCre
  • 在Android Studio gradle项目中使用NDK和STL

    我在将 stlport 链接到 Android Studio 中的 gradle 项目时遇到问题 使用 NDK 的 Eclipse Android 项目迁移到 Android Studio 该项目使用 STL 我有包含内容的 android
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组
  • 如何在片段中实现 onBackPressed() 和意图?

    我知道 onBackPressed 是活动中的一种方法 但是 我想在片段中使用该功能 以便当按下后退按钮时 它会通过 Intent 重定向到另一个活动 有什么办法解决这个问题吗 public class News Events fragme

随机推荐

  • 从苹果网站下载源代码

    如何从 Apple 网站 http opensource apple com source 下载源代码 我特别感兴趣的是http opensource apple com source Security Security 55110 htt
  • 有没有办法在 Google 容器优化操作系统上指定 docker 日志的文件大小限制?

    我在 Google 的容器优化操作系统 COS 上运行了一个非常长时间 且冗长 的容器作业 最终生成了足够的日志来填充磁盘 据我所知 在使用 COS 时没有办法轮换 限制日志文件大小 检查正在运行的容器 它似乎将一个不断增长的文件写入 va
  • Spark 中的分组和标准化

    我有以下数据框 import pandas as pd import numpy as np df pd DataFrame 1 2 3 1 2 1 1 2 2 2 2 2 2 3 2 2 4 2 columns a b c df df s
  • 将本地 HTML 加载到 WebView 中

    我可以将本地 HTML 文件 带有图像和 加载到WebView 只需设置Source参数并不能解决问题 您可以从文件加载它 只要该文件是应用程序包的一部分 例如 WebView2 Source new Uri ms appx web ass
  • 即使在 pip 安装后也无法将 geopy 导入 Jupyter

    我正在尝试安装 geopy 以在 Jupyter 中使用 但当我尝试导入它时 我不断收到以下错误 import geopy ModuleNotFoundErrorTraceback most recent call last
  • android.permission.WRITE_MEDIA_STORAGE 错误

    我正在开发一个编辑文本文件的应用程序 当通过 ACTION OPEN DOCUMENT 活动打开文件时 我能够读 写文件 Intent intent new Intent Intent ACTION OPEN DOCUMENT intent
  • Google OAuth2 通过 cURL (PHP) 返回“unsupported_grant_type”

    我想获取有关谷歌帐户的数据 我使用下一个代码 curl curl init curl setopt array curl array CURLOPT URL gt https www googleapis com oauth2 v4 tok
  • Ext.onReady() 与 $(document).ready()

    有什么不同 我有 document ready 函数 它应该检查 extjs 是否已加载 但主要问题是 extjs 没有按时加载 并且 document ready 内部的内容开始执行 extjs 创建函数会产生主要错误 无法在 Ext c
  • 删除已删除远程的远程跟踪分支

    如果我从我的存储库中删除一个遥控器 假设我删除了该遥控器origin 有没有一种快速方法可以删除该遥控器的所有远程跟踪分支 我知道git branch dr 但据我所知 我必须为每个跟踪分支执行一次此操作 还有git remote prun
  • 当suppressMarkers设置为true时,Google地图路线拖动变得不稳定

    我有一个谷歌地图 我可以在源路线和目的地路线之间添加多个点 停靠点 航点 创建路线 google maps DirectionsService 并放置在地图上 google maps DirectionsRenderer 后 您可以拖动路线
  • 将子域从 Route53 指向 CloudFront,而不使用 CNAME

    我有一个子域 dev example com 我需要将其指向我的 cloudfront 发行版 xyz cloudfront net 我做了以下步骤 1 创建了cloudfront发行版 创建云前端分发时 未在 Cname 字段中指定任何内
  • 无法使 Laravel 4 在本地主机上运行

    在阅读 Laravel4 beta 发布的公告后 我第一次尝试 Laravel 我跟着这些步骤 http four laravel com 我安装了 Composer 和 Laravel 及其所需的所有依赖项 我把 laravel 放进去
  • Maven 的 versions:display-dependency-updates 的 Ivy 等价物是什么?

    我有一个 ivy xml 文件 在其中明确指定我的依赖项 Ivy 中是否内置了任何功能 可以让我发现或自动更新过时的依赖项 我不想使用latest release 因为我想要一个完全稳定且可重现的构建 但每隔一段时间我就会想要更新一些依赖项
  • 现在,Arc Welder 无法在 Windows 上启动测试应用程序

    昨天 2015 年 10 月 19 日下午 06 00 ARC Welder 应用程序开始无法启动应用程序 由于某种原因 现在 当我单击 测试 时 Windows 10 上没有任何反应 我也在 MAC Windows 7 上进行了测试 并且
  • 执行 static_assert 模板类型是另一个模板

    我如何static assert像这样 如果 Boost 不支持 C 或 C 11 中的新功能 也许 Boost 支持它 template
  • 铸造未知类型的节点

    在使用 Neo4j 时 我能够创建带有标签的节点数组 然后在这些节点之间创建关系 这些标签本质上是到我的 POCO 的映射 Dog 标签与 C 中的 Dog POCO 相关 并且这些 POCO 从仅包含 ID 属性的简单基本 POCO 实现
  • 特定 bin 内 numpy 数组的元素数量

    我有一个乐团sorted 一维 数组长度不等 say M0 M1 and M2 我想找到每个数组有多少个元素在特定数字范围内 其中数字范围由另一个已排序数组的相邻元素 say zbin 我想知道什么是最快的方式为了达成这个 在这里 我给出了
  • MediaStore.Images.Media.insertImage 之后的文件名

    我在用MediaStore Images Media insertImage ContentResolver cr String imagePath String name String description 功能将新创建的图像插入到图库
  • Intersystems caché - 以编程方式创建新类

    是否可以编写 ObjectScript 方法 该方法将在命名空间中创建新类并编译它 我的意思是以编程方式创建新类并存储它 如果是这样 我可以稍后使用 ObjectScript 编辑此类 并重新编译 吗 原因 我在字符串变量中定义了类结构 我
  • Laggy Lazy Column Android Compose

    我已经创建了一个完整的应用程序Jetpack 组合 然而 现场的表演Lazy Column非常糟糕 而且没有任何意义 Lazy Column应该是替代RecyclerView but RecyclerView目前效果好多了 我制造了一个La