使用 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 启动错误

Kotlin Coroutines 中是不是有 RxJava 主题的类似物?

Kotlin协程基础介绍--协程(Coroutines)是一种轻量级的线程