android - 发布到 UI 线程

标签 android multithreading kotlin android-handler ui-thread

我想在 onCreate 中创建一个新线程,并在 View 上使用 post 与 UI 线程进行通信。但是,posted 语句似乎从未运行。这是一个小例子:

import android.app.Activity
import android.os.Bundle
import android.widget.TextView    
import kotlin.concurrent.*
import org.jetbrains.anko.*

class MainActivity: Activity(), AnkoLogger {
  protected override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val view = TextView(this)
    setContentView(view)

    thread() {
      info("before post")
      view.post({ info("inside post") })
      info("after post")
    }
  }
}

查看日志,我只能看到before postafter post,但看不到inside post

我做错了什么?

最佳答案

根本问题实际上与 Kotlin 无关。

问题是 View.post()仅当 View 当前附加到 View 层次结构时,才会在主线程上成功调度其工作。 View 的最终附加不会在 setContentView() 时发生。 。它会在一段时间后发生。

如果post()的主题 View 当前未附加(如问题中所示的情况),View创建 RunQueue为当前线程(存储为本地线程)并安排该线程的工作 RunQueue .

因此,给定样本的问题如下。自 View.post()不在主线程上调用,它将创建一个新的 RunQueue对于当前的非主线程,无需检查它是否由 Looper 定向(与主线程一样)。这意味着预定的Runnable本质上进入 RunQueue直到Looper才被处理。开始。在这里所示的情况下,Looper永远不会启动,新线程终止,并且工作永远不会执行。

如果新线程带有 post被延迟到附加 View 之后,例如,当在其上注册单击时,post可能能够在主线程上安排工作。但这里的情况并非如此,因为帖子发生在 1) 附加 View 之前,2) 在不同的非 Looper 上。立即终止的线程。

关于android - 发布到 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36356577/

相关文章:

android - 替代 Android 2.3.3 的 hasPermanentMenuKey()

java - 当- A. 从 Runnable 调用 Activity 方法时会发生什么 B. 多个线程同时调用 Activity 方法

java - RMI Server的哪一部分是用多线程实现的

android - 如何在android 11中检测指纹硬件

javascript - RecyclerView解析JSON数据后添加onClick

Android Drive API V3 - 如何知道文件是否已删除或删除?

android - 如何使用辅助构造函数中的 val?

java - Java中有些线程在 `methodB`,如何保证 "blocked"为 `methodA`?

kotlin - 如何通过ktor-client发送带参数的Http Form

kotlin - 什么代表 Kotlin 中的 arrayOfNulls?