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 post和after post,但从来没有inside post.
我究竟做错了什么?
根本问题实际上与Kotlin无关.
问题是,View.post()如果视图当前附加到视图层次结构,则仅在主线程上成功调度其工作.视图的最终附加不会发生在setContentView().它发生在一段时间后.
如果post()当前未附加主题视图(如问题中所示),则为当前线程(存储为本地线程)View创建一个RunQueue并在其上安排工作RunQueue.
因此,给定样本的问题如下.因为View.post()没有在主线程上调用,所以它将RunQueue为当前的非主线程创建一个新的,而不检查它是否由a指向Looper(如主线程).这意味着计划Runnable基本上进入一个RunQueue直到Looper开始才被处理的计划.在这里显示的情况下,Looper永远不会启动,新线程终止,并且永远不会执行工作.
如果新的线程post被延迟到视图被附加之后,例如,当在其上注册了点击时,post将可能能够在主线程上安排工作.但是这不是这里的情况,因为帖子发生1)在视图附加之前,2)在不同的非Looper线程上立即终止.
| 归档时间: |
|
| 查看次数: |
1685 次 |
| 最近记录: |