前言
记录一些有趣的
Android
知识, 内容不限~
正文
子线程更新UI
考虑如下代码:
注: MainActivity
的Layout
布局只有一个id
为main_text
的TextView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initView()
}
private fun initView() {
// Thread { main_text.text = "World" }.start() // 更新UI成功
Thread {
sleep(200)
main_text.text = "World" // 更新UI失败(崩溃0)
}.start()
}
}
如上代码中, 在第二个子线程中跟新UI
的时候失败了, 报错: Only the original thread that created a view hierarchy can touch its views
; 即常见的不能在子线程中更新UI
; 但是在第一个子线程中跟新UI
成功了, 原因是: 线程的检查是在ViewRootImp
中的checkThread()
中, 但是在onCreate()
中, 此时ViewRootImp
还没有创建, 所以此时无法checkThread()
, 实际上, ViewRootImp
的创建是在onResume()
方法回调之后, 在WindowManagerGlobal
的addView
中创建的; 所以如果这里的initView
即使是在onResume()
中调用也是同样的现象