【问题标题】: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 内部没有繁重的计算(如果必须,请记住{}它),即使它们是从后台线程调用的“将来”。可组合物必须快速处理快速重组。