【问题标题】:Can Jetpack Compose draw/update UI from any thread?Jetpack Compose 可以从任何线程绘制/更新 UI 吗?
【发布时间】:2021-08-18 20:57:21
【问题描述】:

我最近开始学习 Jetpack Compose,所以我一直将它与传统的 UI 开发(xml)进行比较。我在文章here中注意到的,

可组合函数可以并行运行

Compose 可以优化 通过并行运行可组合函数进行重组。这让 Compose 利用多个内核,并运行可组合的函数 不在屏幕上以较低的优先级。

这个优化意味着一个可组合的函数可以在一个 后台线程池。如果可组合函数调用函数 在 ViewModel 上,Compose 可能会从多个线程调用该函数 同时。

这是否意味着 Compose 编译器可以使用后台线程来编写/重构,这与以前只允许主线程更新 UI 不同?

或者我在这里将 UI 开发的声明式风格与传统风格进行比较是错误的,我应该把以前的事情放在一边?

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    我尝试在一个相当小的应用程序中使用 Thread.currentThread().name 从可组合函数中编写当前线程名称。它总是打印“主要”。但是从日志中我可以看到它们没有按调用顺序运行。编写 v1.0.2。

    根据this blog post(2020 年 11 月 21 日),

    将来,乐曲可能会被卸载到 不同的线程,以不同的顺序并行执行,或 类似的事情。这是实现各种潜在优化的大门 Compose 团队希望保持开放

    也许它还没有投入生产,但可能在路上。在编写代码时,我们牢记(如 doc 所说):

    • Composables 可以按任何顺序执行,可以并行运行。不要依赖于以前的 Composable 的结果。也没有副作用和读/写全局变量。从 Composables 调用的回调可能会被不同的线程调用(“将来”),它们应该是幂等的。
    • Composable 内部没有繁重的计算(如果必须,请记住{}它),即使它们是从后台线程调用的“将来”。可组合物必须快速处理快速重组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-08
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2023-01-14
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多