Kotlin Thread线程与UI更新详解

作者:go2coding 时间:2021-10-10 00:18:22 

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

Kotlin 中,使用的还是原先java 的那一套,用的还是Thread ,可能是在javaThread就挺好用的,Kotlin 没有做太多的变化。

线程Thread的使用

Thread 是一个类,有几种用法,比较常规的是声明一个类,继承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 就是一个线程类,它负责数数,每隔一秒钟数一次,并打印出来,这里来启动他。

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,会出现什么?我们想把数据直接显示在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}"),但是很不幸,出现了如下的错误。

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线程,需要到他自己的线程中才能更新。

那怎么办呢?

把数据发送出来,在ui的线程中更新就可以了。在线程中,使用Handler ,相当于把消息发送到主线程中。

inner class MessageHandler: Handler(){
       override fun handleMessage(msg: Message) {
           super.handleMessage(msg)
           tv_count.setText(msg.obj.toString())
       }
   }

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

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。

Kotlin Thread线程与UI更新详解

小结

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

来源:https://blog.csdn.net/weixin_40425640/article/details/128032061

标签:Kotlin,Thread,线程,UI
0
投稿

猜你喜欢

  • Android自定义状态栏颜色与应用标题栏颜色一致

    2022-01-12 02:24:31
  • java Matcher匹配头尾截取替换字符串的案例

    2023-01-30 11:44:48
  • Java使用线程池实现socket编程的方法详解

    2022-12-17 22:05:12
  • java编写Http服务器下载工具

    2021-11-08 08:07:38
  • Java抽象类的概念讲解

    2023-11-04 13:40:35
  • java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例

    2021-06-21 12:29:50
  • Java List转换成String数组几种实现方式详解

    2023-11-10 07:19:41
  • C#中使用Cache框架快速实现Cache操作

    2023-01-21 22:35:27
  • Unity的IPostprocessBuild实用案例深入解析

    2023-05-29 05:54:49
  • Spring Boot两种全局配置和两种注解的操作方法

    2022-06-07 01:14:42
  • SpringBoot配置Email发送功能实例

    2022-03-07 20:52:20
  • Java操作FTP实现上传下载功能

    2021-12-07 18:35:04
  • Android 实现当下最流行的吸顶效果

    2021-12-30 18:46:33
  • java基础教程之拼图游戏的实现

    2022-05-02 21:22:21
  • SpringBoot集成mybatis实例

    2023-03-09 16:57:01
  • Java编写Mapreduce程序过程浅析

    2023-02-26 02:53:20
  • Java基于分治算法实现的棋盘覆盖问题示例

    2021-07-17 14:05:16
  • SpringSecurity构建基于JWT的登录认证实现

    2023-06-14 10:49:02
  • Java详解数据类型的定义与使用

    2023-09-29 01:35:20
  • Java的Swing编程中使用SwingWorker线程模式及顶层容器

    2021-09-09 08:45:06
  • asp之家 软件编程 m.aspxhome.com