使用 Kotlin Coroutines 更新我的 TextView 会导致它崩溃:
Posted
技术标签:
【中文标题】使用 Kotlin Coroutines 更新我的 TextView 会导致它崩溃:【英文标题】:Using Kotlin Coroutines to update my TextView crashes it: 【发布时间】:2021-04-28 22:54:40 【问题描述】:在 Kotlin 编程方面,我是个大新手。我对线程有基本的了解。
事情是这样的:我试图在单击按钮后每秒更新一次我的 TextView(在片段内)。 我将按钮的 onClick 函数设置为包含 10 个 Coroutine 的 delay(1000) 调用。 但我总是得到这个错误:
CalledFromWrongThreadException: Only Main Thread is allowed to change View properties
有什么方法可以在不使用 Kotlin 协程的情况下更新我的 UI 视图?
使用我当前的代码,应用在单击按钮 2 秒后崩溃。这是我的代码(如您所见,它很垃圾):
GlobalScope.launch
for (i in 1..10)
pingCount += 1
GlobalScope.launch(Dispatchers.IO) firstNum.text = "$pingCount"
delay(1000)
【问题讨论】:
你可以在协程中使用这个。 this.Activity.RunOnUiThread(() => textview.text="Hello"; ); 我正在使用 Kotlin。 “在协程中使用它”是什么意思?你的意思是在 GlobalScope 下?另外,我正在使用片段。在这种情况下这重要吗? GlobalScope.launch(Dispatchers.MAIN) firstNum.text = "$pingCount" 在主线程上做 android studio 只是一个 IDE,它可以帮助您编写应用程序。除非您询问 IDE 的功能,否则请不要添加标签 :) 【参考方案1】:您必须使用主线程来更新 UI。只需将调度程序更改为 main。
GlobalScope.launch
for (i in 1..10)
pingCount += 1
GlobalScope.launch(Dispatchers.Main)
firstNum.text = "$pingCount"
delay(1000)
【讨论】:
这就像一个魅力哈哈。我真的高估了整个事情,我应该明白,在 Dispatchers 之后发生的是我想要部署我的方法的实际线程。非常感谢!【参考方案2】:或者也可以这样。在 IO 中,然后在视图本身上发布。
GlobalScope.launch
for (i in 1..10)
pingCount += 1
GlobalScope.launch(Dispatchers.IO)
firstNum.postfirstNum.text = "$pingCount"
delay(1000)
【讨论】:
以上是关于使用 Kotlin Coroutines 更新我的 TextView 会导致它崩溃:的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin Coroutines 选择 Dispatcher
Kotlin Coroutines 通道在 fixedRateTimer 内发送
处理 Kotlin Coroutines 中自定义 okhttp 拦截器引发的异常
Spring WebFlux Reactive 和 Kotlin Coroutines 启动错误