我想在 onCreate
中创建一个新线程,并在 View
上使用 post
与 UI 线程进行通信。但是,post
ed 语句似乎从未运行。这是一个小例子:
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 post
和after 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/