Kotlin Thread線程與UI更新詳解
多線程的好處是不言而喻的,它能幫我們剛更多的事情,同時干不同的事情在程序設(shè)計中是經(jīng)常出現(xiàn)的,這種時候我們使用的是線程。
在Kotlin 中,使用的還是原先java 的那一套,用的還是Thread ,可能是在java 中Thread就挺好用的,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界面的,因為界面有自己的ui線程,需要到他自己的線程中才能更新。
那怎么辦呢?
把數(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ù)的時候,進(jìn)程要考慮的一種方法,他又經(jīng)常很ui界面掛鉤,在大部分的編程語言里,更新ui都必須在ui線程里。這里的線程看起來都比較的簡單,但是真正的在項目中使用線程的話,就務(wù)必要多注意了,因為他很容易出現(xiàn)資源互鎖的情況。
到此這篇關(guān)于Kotlin Thread線程與UI更新詳解的文章就介紹到這了,更多相關(guān)Kotlin Thread線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程滑動效果之倒影效果實現(xiàn)方法(附demo源碼下載)
這篇文章主要介紹了Android編程滑動效果之倒影效果實現(xiàn)方法,基于繼承BaseAdapter自定義Gallery和ImageAdapter實現(xiàn)倒影的功能,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-02-02
Flutter學(xué)習(xí)之構(gòu)建、布局及繪制三部曲
這篇文章主要給大家介紹了關(guān)于Flutter學(xué)習(xí)之構(gòu)建、布局及繪制三部曲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Android Doze模式下Alarm定時任務(wù)實現(xiàn)流程詳解
這篇文章主要介紹了Android Doze模式下Alarm定時任務(wù)實現(xiàn),Android的定時任務(wù)有兩種,一種是JavaAPI提供的Timer類,另一種就是使用Android的Alarm機(jī)制2022-11-11
Android Manifest中meta-data擴(kuò)展元素數(shù)據(jù)的配置與獲取方式
這篇文章主要介紹了Android Manifest中meta-data擴(kuò)展元素數(shù)據(jù)的配置與獲取方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
快速解決android webview https圖片不顯示的問題
今天小編就為大家分享一篇快速解決android webview https圖片不顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Android中使用achartengine生成圖表的具體方法
這篇文章主要介紹了Android中使用achartengine生成圖表的具體方法,有需要的朋友可以參考一下2014-01-01
Android編程基礎(chǔ)之簡單Button事件響應(yīng)綜合提示控件Toast應(yīng)用示例
這篇文章主要介紹了Android編程基礎(chǔ)之簡單Button事件響應(yīng)綜合提示控件Toast應(yīng)用,結(jié)合實例形式分析了Button事件響應(yīng)與Toast提醒的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10

