Kotlin Thread線程與UI更新詳解
多線程的好處是不言而喻的,它能幫我們剛更多的事情,同時(shí)干不同的事情在程序設(shè)計(jì)中是經(jīng)常出現(xiàn)的,這種時(shí)候我們使用的是線程。
在Kotlin 中,使用的還是原先java 的那一套,用的還是Thread ,可能是在java 中Thread就挺好用的,Kotlin 沒(méi)有做太多的變化。
線程Thread的使用
Thread 是一個(gè)類,有幾種用法,比較常規(guī)的是聲明一個(gè)類,繼承Thread ,重載run()的方法,后建立一個(gè)變量,使用start的方法啟動(dòng)線程。
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 就是一個(gè)線程類,它負(fù)責(zé)數(shù)數(shù),每隔一秒鐘數(shù)一次,并打印出來(lái),這里來(lái)啟動(dòng)他。
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
同樣的如果代碼比較簡(jiǎn)潔,可以用如下的代碼來(lái)定義和啟動(dòng)線程。
Thread {
var passc:Int = 0
while (true){
Thread.sleep(1000)
passc ++
println("A second has passed,${passc}")
}
}.start()
在線程中更新UI
如果我們直接在線程中更新UI,會(huì)出現(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)了如下的錯(cuò)誤。
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)
這也是一個(gè)常見(jiàn)的錯(cuò)誤,在很多的語(yǔ)言編程中,是不能直接在線程中更新ui界面的,因?yàn)榻缑嬗凶约旱膗i線程,需要到他自己的線程中才能更新。
那怎么辦呢?
把數(shù)據(jù)發(fā)送出來(lái),在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ā)送出來(lái):
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é)
線程是我們?cè)诙嗳蝿?wù)的時(shí)候,進(jìn)程要考慮的一種方法,他又經(jīng)常很ui界面掛鉤,在大部分的編程語(yǔ)言里,更新ui都必須在ui線程里。這里的線程看起來(lái)都比較的簡(jiǎn)單,但是真正的在項(xiàng)目中使用線程的話,就務(wù)必要多注意了,因?yàn)樗苋菀壮霈F(xiàn)資源互鎖的情況。
到此這篇關(guān)于Kotlin Thread線程與UI更新詳解的文章就介紹到這了,更多相關(guān)Kotlin Thread線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ImageView點(diǎn)擊可變暗的實(shí)例代碼(android代碼技巧)
本文給大家分享一段實(shí)例代碼給大家介紹ImageView點(diǎn)擊可變暗的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-02-02
詳解如何使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK
這篇文章主要介紹了詳解如何使用VisualStudio高效開(kāi)發(fā)調(diào)試AndroidNDK,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Android利用爬蟲(chóng)實(shí)現(xiàn)模擬登錄的實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了Android利用爬蟲(chóng)實(shí)現(xiàn)模擬登錄的實(shí)現(xiàn)實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09
Android?RecyclerBarChart繪制使用教程
這篇文章主要為大家介紹了Android?RecyclerBarChart繪制使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Android開(kāi)發(fā)之TimePicker控件用法實(shí)例詳解
這篇文章主要介紹了Android開(kāi)發(fā)之TimePicker控件用法,結(jié)合實(shí)例形式詳細(xì)分析了Android項(xiàng)目的建立及TimePicker控件的具體使用技巧,需要的朋友可以參考下2016-02-02
基于Android AppWidgetProvider的使用介紹
本篇文章小編為大家介紹,基于Android AppWidgetProvider的使用。需要的朋友參考下2013-04-04
Android實(shí)現(xiàn)極簡(jiǎn)打開(kāi)攝像頭
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)極簡(jiǎn)打開(kāi)攝像頭,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
flutter實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了flutter發(fā)送驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07

