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

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

具体代码为:

@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)

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.mzph.cn/bicheng/18381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#学习方法#笔记#微信

飞鸟写作是一个非常好用、靠谱且方便的论文写作工具,可以帮助用户高效地完成论文写作任务。无论是学生还是研究人员,使用飞鸟写作都能极大地提升写作效率和质量。 首先,飞鸟写作具有强大的查重降重功能,能够帮助用户快速检测论文…

【数据库】数据库学习(MySQL,Oracle,PostgreSql)

数据库语句学习 摘要:文章主要内容是数据库语句的基本操作,以及一些基本的数据库标准库函数 重点:SQL语句对大小写不敏感 数据库操作语句 SELECT - 从数据库表中获取数据UPDATE - 更新数据库表中的数据DELETE - 从数据库表中删除数据INSERT …

OSPF的扩展配置

1、认证——直连的邻居或邻接关系间,进行认证配置后,5种数据包中均携带身份核实的密码,且华为设备会对更新信息进行加密--前提为认证方式选择密文认证 1)接口认证 [r1-GigabitEthernet0/0/1ospf authentication-mode md5 1 cipher 123456 直连的邻居间秘钥和编号、模…

行列视(RCV)能否同时支持多个实时数据库?

行列视(RCV)生产数据应用系统在设计时考虑到了多数据源的需求,因此它支持同时连接多个实时数据库。这意味着用户可以轻松地将来自不同实时数据库的数据整合到行列视(RCV)系统中,实现数据的集中管理和分析。…

Android14 WMS-窗口添加流程(二)-Server端

上一篇文章讲到了Client端窗口添加流程,本文接着上文往下讲,讲一下Server端的窗口添加流程。 1. WindowManagerService#grantInputChannel 由grantInputChannel我们可以看到,Client端传入了session对象, 发起者Uid-callingUid&am…

X.509数字证书

在国密标准文件《GMT 0015-2012 基于SM2密码算法的数字证书格式》里有对X.509数字证书格式的详细描述。 数字证书的定义 由国家认可的,具有权威性、可信性和公正性的第三方证书认证机构(CA)进行数字签名的一个可信的数字化文件。 数字证书…

YOLOv10代码详细介绍(附录训练教程和权重)

前言 YOLOv10 是清华大学研究人员在 UltralyticsPython 清华大学的研究人员在 YOLOv10软件包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架构方面的不足。通过消除非最大抑制(NMS)和优化各种模型…

【几何角度】感知机

本质:将n维空间中的一些点线性投影到一维,在一维轴上找一个阈值对这些点进行二分类。 程序: import numpy as npclass Perceptron:def __init__(self, learning_rate0.01, n_iterations1000):self.learning_rate learning_rateself.n_itera…

【Python基础】一文搞懂:Python 中 “requirements.txt“ 文件生成和使用

文章目录 1 引言2 什么是 requirements.txt?3 如何生成 requirements.txt?3.1 方法一:使用 pip freeze3.2 方法二:使用 pipreqs 3.3 使用 pip freeze 和 pipreqs 的对比4 如何使用 requirements.txt?4.1 安装依赖4.2 更…

[从零开发JS应用] 如何在VScode中配置Javascript环境,常见的调试方法有哪些?

一、安装VSCode和Node.js 记录环境配置:本文配置的环境主要针对单独JS文件的断点调试,主要是为了调试LeetCode里面的代码。 首先在官网下载对应的版本:https://nodejs.org/en/ 开始安装,可以自定义选择安装路径。 这里选择Add Pa…

【亲测,安卓版】快速将网页网址打包成安卓app,一键将网页打包成app,免安装纯绿色版本,快速将网页网址打包成安卓apk

背景:部分客户需求将自己网站打包成app,供用户在浏览器安装使用、 网页网址快速生成app 准备材料操作流程第一步:打开HBuilder X新建项目第二步创建Wap2App项目第三步修改App图标第四步发布app第五步查看apk 准备材料 1.需要打包的网页 2.ap…

在网页开发中,前后端如何更好地协同工作?

在网页开发中,前后端如何更好地协同工作是非常关键的,以下是一些方法和技巧可以帮助前后端更好地协同工作: 1.明确需求和规范:前后端应该共同讨论和明确项目的需求和规范,包括功能、界面、数据格式等。确保双方对项目…

页面加载不出来,报错[@umijs/runtime] load component failed

问题描述 页面加载不出来数据,一直在旋转,控制台输出内容如下: 原因分析: 之前页面是没有问题的,在写当前页面突然出现页面加载不出来,控制台报错,主要是页面引入了这行代码报错 import { …

MX Component基础使用(多点位读取,多点位写入)

步骤,先连接PLC,然后在填入对应的点位 D10 然后去读取。 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;us…

边缘计算网关的主要功能有哪些?天拓四方

随着物联网(IoT)的快速发展和普及,边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备,边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

民国漫画杂志《时代漫画》第13期.PDF

时代漫画13.PDF: https://url03.ctfile.com/f/1779803-1247458360-14efab?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!

数组的定义、顺序存储及特殊矩阵的存储

目录 一、数组的定义 1.1概念 1.2抽象数据类型定义 二、数组的顺序存储 2.1一维数组元素的存储位置 2.2二维数组元素的存储位置 2.3三维数组元素的存储位置 三、特殊矩阵的压缩存储 3.1相关概念 3.2对称矩阵 3.3三角矩阵 3.4对角矩阵(带状矩阵&#xff0…

【机器学习300问】102、什么是混淆矩阵?

一、混淆矩阵的定义 混淆矩阵是一种用于评估分类模型性能的评估指标。当模型对数据进行预测并将数据分配到预定义的类别时,混淆矩阵提供了一种直观的方式来总结这些预测与数据实际类别之间的对应关系。具体来说,它是一个表格。 二、分类模型性能评估一级…

私域用户画像分析

为什么做私域要分析用户画像? 1、更好地了解用户需求:通过分析用户画像,可以深入了解用户的需求、偏好、行为等特征,从而更好地满足他们的需求。 2、个性化营销:根据用户画像,可以为用户提供个性化的营销…

js setTimeout、setInterval、promise、async await执行顺序梳理

基础知识 async: 关键字用于标记一个函数为异步函数,该函数中有一个或多个promise对象,需要等待执行完成后才会继续执行。 await:关键字,用于等待一个promise对象执行完,并返回其中的值,只能在async函数内部使用。可…