android - 仅在多模块项目中出现的 Jetpack Compose 性能问题

标签 android android-jetpack-compose

我在 Jetpack Compose 中开发了一个相当复杂的键盘布局。最初,布局工作正常,按下按键时动画运行非常流畅。不幸的是,由于事件的一些重新组合后,动画和一切都变得非常缓慢和滞后。
我尝试对 Jave 方法调用进行采样,但我只能看到某些函数比平时花费的时间要长得多。
编辑:
我已经能够隔离问题。我发现性能问题只出现在多模块项目中。当我将完全相同的撰写代码放在根目录app模块问题消失。
我创建了一个重现该问题的项目:

  • Mutli Module Project with performance issue
  • Single Module Project without performace issue

  • 如果您想在多模块项目中重现该问题,您必须多次在类别之间切换,然后一切都变得非常滞后
    Example Video
    注意:我知道 Jetpack Compose 仍处于 alpha 阶段,这个问题可能是 Jetpack Compose 中的一个错误。但我想确保它不是我的代码的错误或 Compose 的一般限制

    最佳答案

    解决方法是使用 remember可组合为 Keyboard @Composable以防止在重组期间进行布局计算。

    val refs: List<List<Pair<Key, ConstrainedLayoutReference>>> =
             remember {
                 keyboard.map { row ->
                    row.map {
                       it to createRef()
                   }
              }
    }
    
    val modifier = remember { ... }
    
    val modifierPressed = remember { ... }        
    
    源代码: https://github.com/dautovicharis/example_compose-keyboard-multimodule/commits/main

    关于android - 仅在多模块项目中出现的 Jetpack Compose 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65818058/

    相关文章:

    android - 如何减少jetpack compose `TopAppBar`中导航图标和标题之间的水平空间?

    android - Jetpack Compose - 如何获取 LazyVerticalGrid 项目行索引?

    Android StrictMode 线程策略显示错误

    java - 显示类似 Confide android 应用程序的文本

    android-studio - 刀柄 Kotlin 中不受支持的元数据版本

    android - 在不使用 fragment 的情况下构建首选项屏幕的最佳 Compose 方法是什么?

    android - 使用撰写文本链接

    android - 有没有办法观察房间数据库中一组值的总和?

    android - 是否可以添加通过单击 Android 中的按钮调用的方法(不添加监听器)

    android - 使用适用于 Java 的 AWS 开发工具包创建 AmazonSNSClient 时出现 NoClassDefFoundError