Android在线程中更新UI和在协程中更新UI
2021-09-13 本文已影响0人
会写代码的小猿猴
1、在子线程里面更新UI
我们都知道Android只能在主线程里面对UI更新,所以谷歌提供了很多在子线程里面更新UI的方法,比如最出名的异步消息处理机制Handler,在这里我就不说了,我们看另一种简单好用的方法,runOnUiThread。直接看例子,越来越懒得写太多字了。
这里主要以一个计时器为例:
private fun setup1() {
thread {
for (i in 10 downTo 1) {
Thread.sleep(1000)
this.runOnUiThread {
tv.text = "$i"
}
}
this.runOnUiThread { tv.text = "Done!" }
}
}
主要就是在布局代码里面创建一个TextView,然后每个一秒更新它的值,就形成一个从10开始倒数的计时器
注意:runOnUiThread内部不能做耗时操作:
所以以上代码不能写成:
private fun setup1() {
thread {
this.runOnUiThread {
for (i in 10 downTo 1) {
Thread.sleep(1000)
tv.text = "$i"
}
tv.text = "Done!"
}
}
}
写成这样虽然不会报错,但不会执行循环内部的更新UI代码,只会等待十秒之后执行 tv.text = "Done!"
2、在协程里面更新UI
使用协程需要先注入依赖
// Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2'
更新UI的方法
private fun setup2() {
GlobalScope.launch(Dispatchers.Main) {
for (i in 10 downTo 1) {
tv.text = "$i"
delay(1000)
}
tv.text = "Done!"
}
}
也是一样的方法,只是改成在协程里面更新UI,在协程里面更新时不需要用runOnUiThread,也不需要用Handler消息处理机制,但是在协程挂起的时候要用 GlobalScope.launch(Dispatchers.Main)不能直接用 GlobalScope.launch(),这里不了解协程的兄弟可以去看看我写的kotlin中的协程(Couroutines)或者大神写的
Kotlin协程的简单用法
好了,也就简单Mark一下,实际情况实际应用,欢迎留言讨论。