Kotlin Thread線程與UI更新詳解
多線程的好處是不言而喻的,它能幫我們剛更多的事情,同時(shí)干不同的事情在程序設(shè)計(jì)中是經(jīng)常出現(xiàn)的,這種時(shí)候我們使用的是線程。
在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界面的,因?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)文章
ImageView點(diǎn)擊可變暗的實(shí)例代碼(android代碼技巧)
本文給大家分享一段實(shí)例代碼給大家介紹ImageView點(diǎn)擊可變暗的實(shí)例代碼,非常不錯,具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-02-02詳解如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK
這篇文章主要介紹了詳解如何使用VisualStudio高效開發(fā)調(diào)試AndroidNDK,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12Android利用爬蟲實(shí)現(xiàn)模擬登錄的實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了Android利用爬蟲實(shí)現(xiàn)模擬登錄的實(shí)現(xiàn)實(shí)例的相關(guān)資料,希望通過本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09Android?RecyclerBarChart繪制使用教程
這篇文章主要為大家介紹了Android?RecyclerBarChart繪制使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android開發(fā)之TimePicker控件用法實(shí)例詳解
這篇文章主要介紹了Android開發(fā)之TimePicker控件用法,結(jié)合實(shí)例形式詳細(xì)分析了Android項(xiàng)目的建立及TimePicker控件的具體使用技巧,需要的朋友可以參考下2016-02-02基于Android AppWidgetProvider的使用介紹
本篇文章小編為大家介紹,基于Android AppWidgetProvider的使用。需要的朋友參考下2013-04-04flutter實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了flutter發(fā)送驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07