Android

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一下,实际情况实际应用,欢迎留言讨论。

上一篇下一篇

猜你喜欢

热点阅读