最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kotlin Thread線程與UI更新詳解

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

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

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 就是一個線程類,它負責數(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()

在線程中直接設置 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界面的,因為界面有自己的ui線程,需要到他自己的線程中才能更新。

那怎么辦呢?

把數(shù)據(jù)發(fā)送出來,在ui的線程中更新就可以了。在線程中,使用Handler ,相當于把消息發(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。

小結

線程是我們在多任務的時候,進程要考慮的一種方法,他又經常很ui界面掛鉤,在大部分的編程語言里,更新ui都必須在ui線程里。這里的線程看起來都比較的簡單,但是真正的在項目中使用線程的話,就務必要多注意了,因為他很容易出現(xiàn)資源互鎖的情況。

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

相關文章

最新評論

闸北区| 康乐县| 湖州市| 扎赉特旗| 外汇| 南溪县| 都昌县| 西和县| 朝阳市| 开封市| 六枝特区| 伊川县| 富蕴县| 青田县| 师宗县| 饶阳县| 义乌市| 通许县| 莱芜市| 永春县| 儋州市| 亳州市| 长春市| 唐海县| 专栏| 大姚县| 庄河市| 比如县| 洮南市| 房产| 阿勒泰市| 台中市| 柳江县| 军事| 将乐县| 宜君县| 阿坝县| 南召县| 西盟| 华亭县| 神农架林区|