记一个低级错误导致的ANR

应用开发过程中,开发测试的时候,运行良好;

然后在随便点击monkey测试后,引发了一个ANR;

查看下代码:

这段代码,主要是给图片显示自动轮播的逻辑,但是在 timeSpan=0的时候,界面没有延时,而是不断地改变shownext的值,导致图片不断地播放下一个图片,造成了界面的卡死。

所以可以警示的,0 的操作。

引发思考,

LaunchedEffect中的操作会阻塞线程吗?

在Jetpack Compose中,LaunchedEffect 本身并不会直接阻塞线程。LaunchedEffect 是一个用于在组件的生命周期内执行副作用(side effects)的 Composable 函数。它主要用于在组件首次渲染到屏幕上时执行一些操作,或者在组件的某些关键生命周期点(如重新组合且其 key 发生变化时)执行操作。

LaunchedEffect 内部通常与协程(Coroutine)结合使用,通过 launch 方法来启动一个协程。协程是轻量级的线程,能够在不阻塞主线程的情况下执行耗时操作,如网络请求、数据库操作或复杂计算等。

当你在 LaunchedEffect 中使用协程时,这些协程是在后台线程中执行的,不会阻塞主线程(UI线程)。然而,如果你从协程中直接访问UI元素或执行UI更新,你需要确保这些操作是在主线程上执行的。这通常通过使用 withContext(Dispatchers.Main) 来实现,但在 Kotlin 协程的 Compose 集成中,你更可能会使用 rememberCoroutineScope().launchlaunchInComposition(coroutineScope) 这类方法,它们会自动处理UI更新在主线程上执行的问题。

因此,LaunchedEffect 本身不会阻塞线程,但如果你在其中启动的协程中执行了不当的操作(如直接在后台线程中更新UI),则可能会遇到线程安全问题或UI更新不及时的问题。正确使用协程和 Compose 的生命周期管理函数,可以确保你的应用保持响应性和流畅性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值