0


Kotlin 开发Android app(十八):线程Thread和UI更新

多线程的好处是不言而喻的,它能帮我们刚更多的事情,同时干不同的事情在程序设计中是经常出现的,这种时候我们使用的是线程。

  1. Kotlin

中,使用的还是原先

  1. java

的那一套,用的还是

  1. Thread

,可能是在

  1. java

  1. Thread

就挺好用的,

  1. Kotlin

没有做太多的变化。

在这里插入图片描述

线程Thread的使用

  1. Thread

是一个类,有几种用法,比较常规的是声明一个类,继承

  1. Thread

,重载

  1. run()

的方法,后建立一个变量,使用

  1. start

的方法启动线程。

  1. innerclass CountThread:Thread(){var passc:Int =0overridefunrun(){super.run()while(true){
  2. Thread.sleep(1000)
  3. passc ++println("A second has passed,${passc}")}}}
  1. CountThread

就是一个线程类,它负责数数,每隔一秒钟数一次,并打印出来,这里来启动他。

  1. var countT =CountThread()
  2. countT.start()

这里每隔一秒钟,打印一次记录。

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

同样的如果代码比较简洁,可以用如下的代码来定义和启动线程。

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

在线程中更新UI

如果我们直接在线程中更新UI,会出现什么?我们想把数据直接显示在

  1. TextView

中,在线程中这样写:

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

在线程中直接设置

  1. tv_count.setText("A second has passed,${passc}")

,但是很不幸,出现了如下的错误。

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

这也是一个常见的错误,在很多的语言编程中,是不能直接在线程中更新ui界面的,因为界面有自己的ui线程,需要到他自己的线程中才能更新。

那怎么办呢?

把数据发送出来,在ui的线程中更新就可以了。在线程中,使用

  1. Handler

,相当于把消息发送到主线程中。

  1. innerclass MessageHandler:Handler(){overridefunhandleMessage(msg: Message){super.handleMessage(msg)
  2. tv_count.setText(msg.obj.toString())}}

在线程中把数据发送出来:

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

这样就能成功的在界面上更新ui。

在这里插入图片描述

小结

线程是我们在多任务的时候,进程要考虑的一种方法,他又经常很ui界面挂钩,在大部分的编程语言里,更新ui都必须在ui线程里。这里的线程看起来都比较的简单,但是真正的在项目中使用线程的话,就务必要多注意了,因为他很容易出现资源互锁的情况。

标签: android kotlin ui

本文转载自: https://blog.csdn.net/weixin_40425640/article/details/128032061
版权归原作者 go2coding 所有, 如有侵权,请联系我们删除。

“Kotlin 开发Android app(十八):线程Thread和UI更新”的评论:

还没有评论