Jetpack Compose可组合函数中能否调用viewModel()实例化ViewModel?
关于Compose可组合函数中调用viewModel()的疑问
Android 文档指出可组合函数可并行运行,这意味着任意特定可组合函数可在任意线程中调用。
若我们按如下方式实例化ViewModel:
@Composable fun FooScreen(viewModel: FooViewModel = viewModel()) { ... }
则意味着viewModel()(androidx.lifecycle.viewmodel.compose.viewModel)可在任意线程调用(尤其是后台线程)。
进一步探究viewModel()的实现可知,它会调用ViewModelProvider#get,而ViewModelProvider#get被标记了@MainThread注解。
这是否意味着我们无法在可组合函数中调用viewModel()?
答案:完全可以安全调用
Compose的并行运行机制虽然允许可组合函数在后台线程执行,但框架内部已经做了线程调度处理,确保viewModel()这类必须在主线程执行的操作会被切换到主线程完成。
具体细节:
viewModel()作为Compose扩展函数,内部通过remember结合框架的线程调度能力,将ViewModelProvider#get的调用逻辑切换到主线程执行。- 即便可组合函数在后台线程被触发执行,
viewModel()的核心获取逻辑仍会被调度到主线程,不会触发@MainThread注解的线程检查异常。
Compose在设计时就考虑到了与Android生命周期组件的交互场景,因此无需额外处理线程问题,按常规方式在可组合函数中初始化ViewModel即可。
内容的提问来源于stack exchange,提问作者Eugene Chumak
相关产品推荐
相关产品推荐

