美文网首页Android
Android在线程中更新UI和在协程中更新UI

Android在线程中更新UI和在协程中更新UI

作者: 会写代码的小猿猴 | 来源:发表于2021-09-13 15:44 被阅读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一下,实际情况实际应用,欢迎留言讨论。

    相关文章

      网友评论

        本文标题:Android在线程中更新UI和在协程中更新UI

        本文链接:https://www.haomeiwen.com/subject/bjjfgltx.html