发布到UI线程

Cac*_*tus 2 multithreading android ui-thread kotlin android-handler

我想创建一个新的线程onCreate并使用posta 来与UI线程进行通信View.但是,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")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

查看日志,我只能看到before postafter post,但从来没有inside post.

我究竟做错了什么?

Dou*_*son 5

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

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

如果post()当前未附加主题视图(如问题中所示),则为当前线程(存储为本地线程)View创建一个RunQueue并在其上安排工作RunQueue.

因此,给定样本的问题如下.因为View.post()没有在主线程上调用,所以它将RunQueue为当前的非主线程创建一个新的,而不检查它是否由a指向Looper(如主线程).这意味着计划Runnable基本上进入一个RunQueue直到Looper开始才被处理的计划.在这里显示的情况下,Looper永远不会启动,新线程终止,并且永远不会执行工作.

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