【Android-Compose】ViewModel 的 init 初始化函数中使用非主线程上的协程闪退问题

embedded/2024/10/22 14:41:40/

问题:
在 Compose- kotlin 中,如果在 ViewModel 中的 init 函数中使用非主线程上的协程会导致闪退问题,

具体代码为:

kotlin">@HiltViewModel
class ApkScreenViewModel @Inject constructor(...
) : ViewModel() {// 1. 在非 主线程的协程上初始化数据fun initData1() {viewModelScope.launch(Dispatchers.Default) {// 在 默认线程上初始化数据()// 或者viewModelScope.launch(Dispatchers.IO)// 在IO线程上初始化...}}// 2. 在 主线程的协程上初始化数据fun initData2() {viewModelScope.launch(Dispatchers.Main) {// 在 主线程上初始化数据()// 或者viewModelScope.launch()// 在主线程上初始化,默认就是主线程,参数可以不写...}}init {println("vm初始化测试")initData1()// 1 调用此函数会导致闪退initData2()// 2 调用此函数不不不会导致闪退}
}

猜测的原因:
ViewModel 的 init 函数本身,
可能就是一个协程作用域(默认在主线程上,比如init(Dispatchers.Main)),

1、所以在主线程上的协程作用域内在运行其他线程上的协程,就会导致错误闪退(比如运行initData1)。
2、但是如果在主线程上再运行主线程上的协程,不会导致闪退(比如运行initData2)

kotlin">1、正确做法:fun initData() {viewModelScope.launch(Dispatchers.Main) {// 在 主线程上初始化数据()// 或者viewModelScope.launch()// 在主线程上初始化,默认就是主线程,参数可以不写viewModelScope.launch(Dispatchers.Main) {// 在 主线程上初始化数据()// 主线程的协程内可以再运行主线程上的协程,但是不可以运行其他线程上的协程,比如不可以运行IO、Default}}}
2、错误做法:(闪退)fun initData() {viewModelScope.launch(Dispatchers.Main) {// 在 主线程上初始化数据()// 或者viewModelScope.launch()// 在主线程上初始化,默认就是主线程,参数可以不写viewModelScope.launch(Dispatchers.IO) {// 在 主线程上初始化数据()// 主线程不可以运行其他线程上的协程,比如不可以运行IO、Default}}}

总结:在使用 kotlin 协程的时候要清楚所在的线程,避免嵌套不同线程的协程!


http://www.ppmy.cn/embedded/43094.html

相关文章

基于Go实现的分布式主键系统

基于Go实现的分布式主键系统 摘要 随着互联网的发展,微服务得到了快速的发展,在微服务架构下,分布式主键开始变得越来越重要。目前分布式主键的实现方式颇多,有基于数据库自增的、基于UUID的、基于Redis自增的、基于数据库号段的…

Java 文件操作和输入输出流

在 Java 编程中,文件操作和输入输出流是非常常见和重要的任务,它们允许你读取和写入文件、处理数据流等。 文件操作概述 文件操作是指对文件进行创建、读取、写入、删除等操作的过程。在 Java 中,文件操作通常涉及到使用文件对象、输入输出…

JVM学习-javap解析Class文件

解析字节码的作用 通过反编译生成字节码文件,可以深入了解Java工作机制,但自己分析类文件结构太麻烦,除了第三方的jclasslib工具外,官方提供了javapjavap是jdk自带的反解析工具,它的作用是根据class字节码文件&#x…

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片 1.背景2.接口 1.背景 System.Drawing.Common 是一个用于图像处理和图形操作的库,它是 System.Drawing 命名空间的一部分。由于 .NET Core 和 .NET 5 的跨平台特性,许多以前内置于 .NET Framework…

Java设计模式(23种设计模式 重点介绍一些常用的)

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:…

在某云服务器上搭建公网kali linux2.0

前提: 可用的 CVM 实例 挂载一个系统盘之外的盘,安装完成后可卸载! 创建实例,安装centos7系统! 然后执行fdisk -l看磁盘的情况 在这里我将把镜像写入vdb这块数据盘 非 root 的情况下记得sudo执行以下命令 注意&…

Pycharm最新安装教程(最新更新时间2024年5月27日)

ps:本教程Pycharm安装,最新更新时间:2024年5月27日,公众号持续更新关注公众号防失联哦 Pycharm 再次更新了一个小版本。又回到老话题,2023.3.2这个版本是否还能安装,笔者也亲测了一下。还是沿用本站之前的…

01.爬虫---初识网络爬虫

01.初识网络爬虫 1.什么是网络爬虫2.网络爬虫的类型3.网络爬虫的工作原理4.网络爬虫的应用场景5.网络爬虫的挑战与应对策略6.爬虫的合法性总结 1.什么是网络爬虫 网络爬虫,亦称网络蜘蛛或网络机器人,是一种能够自动地、系统地浏览和收集互联网上信息的程…