【问题标题】:Change layout from Coroutine从协程更改布局
【发布时间】:2020-09-06 11:22:36
【问题描述】:

协程启动

GlobalScope.launch(){
    get_message_pulling()
}

我需要从get_message_pulling() 编辑布局,但出现错误

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

【问题讨论】:

标签: android kotlin kotlin-coroutines coroutine


【解决方案1】:

因为在不指定协程上下文的情况下使用GlobalScope.launch() 将在使用Dispatchers.Default 的后台线程上运行您的代码,而不是 MainThread,因此您只能通过 MainThread 协程的上下文与 UI 通信

GlobalScope.launch(){
   get_message_pulling()

    withContext(Dispatchers.Main) {
       // then update the UI 
    }
}

【讨论】:

    【解决方案2】:

    解决者

    private fun get_message_pulling() {
    
    runOnUiThread {
     // ui changing code
    }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用 Android 特定的Dispatchers.Main 来执行 UI 更新。此外,避免使用GlobalScope 来启动协程,如here 所述。相反,请选择 Dispatchers.DefaultDispatchers.IO

      // CPU bound - Dispatchers.Default
      // IO bound - Dispatchers.IO
      val defaultScope = CoroutineScope(Dispatchers.Default)
      
      defaultScope.launch {
          get_message_pulling()
          withContext(Dispatchers.Main){
              // Your UI updates
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 2019-11-07
        • 1970-01-01
        相关资源
        最近更新 更多