欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin Thread線程與UI更新詳解

 更新時(shí)間:2022年12月07日 10:08:20   作者:go2coding  
本篇主要介紹Kotlin中Thread線程與UI更新,注意不是協(xié)程而是線程。Kotlin本身是支持線程的。同時(shí)協(xié)程也是運(yùn)行在線程中的

多線程的好處是不言而喻的,它能幫我們剛更多的事情,同時(shí)干不同的事情在程序設(shè)計(jì)中是經(jīng)常出現(xiàn)的,這種時(shí)候我們使用的是線程。

Kotlin 中,使用的還是原先java 的那一套,用的還是Thread ,可能是在javaThread就挺好用的,Kotlin 沒有做太多的變化。

線程Thread的使用

Thread 是一個類,有幾種用法,比較常規(guī)的是聲明一個類,繼承Thread ,重載run()的方法,后建立一個變量,使用start的方法啟動線程。

    inner class CountThread:Thread(){
        var passc:Int = 0
        override fun run() {
            super.run()
            while (true){
                Thread.sleep(1000)
                passc ++
                println("A second has passed,${passc}")
            }
        }
    }

CountThread 就是一個線程類,它負(fù)責(zé)數(shù)數(shù),每隔一秒鐘數(shù)一次,并打印出來,這里來啟動他。

        var countT = CountThread()
        countT.start()

這里每隔一秒鐘,打印一次記錄。

I/System.out: A second has passed,1
I/System.out: A second has passed,2
I/System.out: A second has passed,3
I/System.out: A second has passed,4
I/System.out: A second has passed,5
I/System.out: A second has passed,6
I/System.out: A second has passed,7
I/System.out: A second has passed,8
I/System.out: A second has passed,9
I/System.out: A second has passed,10

同樣的如果代碼比較簡潔,可以用如下的代碼來定義和啟動線程。

        Thread {
            var passc:Int = 0
            while (true){
                Thread.sleep(1000)
                passc ++
                println("A second has passed,${passc}")
            }
        }.start()

在線程中更新UI

如果我們直接在線程中更新UI,會出現(xiàn)什么?我們想把數(shù)據(jù)直接顯示在TextView中,在線程中這樣寫:

        Thread {
            var passc:Int = 0
            while (true){
                Thread.sleep(1000)
                passc ++
                println("A second has passed,${passc}")
                tv_count.setText("A second has passed,${passc}")
            }
        }.start()

在線程中直接設(shè)置 tv_count.setText("A second has passed,${passc}"),但是很不幸,出現(xiàn)了如下的錯誤。

    Process: com.kotlin.kotlin_start_ch18, PID: 24758
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:11131)

這也是一個常見的錯誤,在很多的語言編程中,是不能直接在線程中更新ui界面的,因?yàn)榻缑嬗凶约旱膗i線程,需要到他自己的線程中才能更新。

那怎么辦呢?

把數(shù)據(jù)發(fā)送出來,在ui的線程中更新就可以了。在線程中,使用Handler ,相當(dāng)于把消息發(fā)送到主線程中。

    inner class MessageHandler: Handler(){
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            tv_count.setText(msg.obj.toString())
        }
    }

在線程中把數(shù)據(jù)發(fā)送出來:

       Thread {
            var passc:Int = 0
            while (true){
                Thread.sleep(1000)
                passc ++
                println("A second has passed,${passc}")
                //tv_count.setText("A second has passed,${passc}")
                var message = Message()
                message.obj = "A second has passed,${passc}"
                messageHandler.sendMessage(message)
            }
        }.start()

這樣就能成功的在界面上更新ui。

小結(jié)

線程是我們在多任務(wù)的時(shí)候,進(jìn)程要考慮的一種方法,他又經(jīng)常很ui界面掛鉤,在大部分的編程語言里,更新ui都必須在ui線程里。這里的線程看起來都比較的簡單,但是真正的在項(xiàng)目中使用線程的話,就務(wù)必要多注意了,因?yàn)樗苋菀壮霈F(xiàn)資源互鎖的情況。

到此這篇關(guān)于Kotlin Thread線程與UI更新詳解的文章就介紹到這了,更多相關(guān)Kotlin Thread線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論