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

news2024/9/22 9:34:50

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

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。

在这里插入图片描述

小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

翻译: 如何学习编译器:LLVM Edition

编译器和编程语言是一个很大的话题。您不能只选择学习路径并在某个时候完成它。有许多不同的区域,每个区域都是无穷无尽的。 在这里,我想分享一些有助于学习编译器的链接。这份清单不可能详尽无遗——每个人都很忙,没有人有时间阅读龙书。 …

前端知识大全之CSS

目录 一、概念讲解 学习CSS之前必学的HTML (超链接) 二、正文代码 1.行内样式 2.内部样式(选择器) 3.外部样式 4.样式的优先级 5.简单选择器之定义单个标签(id) 6.简单选择器之定义多个标签&#xff…

低代码平台,企业业务创新的最佳路径

数字化转型的必然趋势及面临的问题 数字经济时代,数字化转型是企业在行业赛道上领先的必经之路,然而,数字化转型升级的道路并不是畅通无阻的,也不是企业单枪匹马就能干成的,各个企业在转型过程中都或多或少会遇到技术…

MySQL-索引

一、介绍 索引是数据库对象之一,用于提高字段检索效率,使用者只需要对哪个表中哪些字段建立索引即可,其余什么都不做,数据库会自行处理。 索引提供指向存储在表的指定列中的数据值的指针,如同图书的目录,…

【MMDetection】MMDetection中AnchorGenerator学习笔记

文章目录初始化-AnchorGenerator()Anchor平移-grid_priors计算有效anchor-valid_flags参考文献初始化-AnchorGenerator() TASK_UTILS.register_module() class AnchorGenerator:def __init__(self, strides, ratios, scalesNone, base_sizesNone, scale_majorTrue, octave_bas…

numpy的部分通用函数浅谈

numpy的部分通用函数 1.数组算术运算符 运算符对应的通用函数描述np.add加法运算(即112)-np.substract减法运算(即3-21)-np.negative负数运算(即-2)*Nnp.multiply乘法运算(即2*36)/np.divide除…

Optional用法与争议点

Optional用法与争议点 简介 要说Java中什么异常最容易出现,我想NullPointerException一定当仁不让,为了解决这种null值判断问题,Java8中提供了一个新的工具类Optional,用于提示程序员注意null值,并在特定场景中简化代…

软件测试8年,却被应届生踩在头上,是应届生太牛了,还是我们太弱了?

前几天有个朋友向我哭诉,说他在公司干了8年的软件测试,却被一个实习生代替了,该何去何从? 这是一个值得深思的问题,作为职场人员,我们确实该思考,我们的工作会被实习生代替吗?这是一个很尖锐的问题&…

MFC基于对话框——仿照Windows计算器制作C++简易计算器

目录 一、界面设计 二、设置成员变量 三、初始化成员变量 四、初始化对话框 ​五、添加控件代码 1.各个数字的代码(0~9) 2.清除功能的代码 3.退格功能的代码 4.加减乘除功能的代码 5.小数点功能的代码 6.正负号功能的代码 7.等于功能的代码…

算法day42|背包问题

目录 01背包问题 二维 01背包问题 一维 416. 分割等和子集 背包问题分为:01背包,完全背包,多种背包01背包指的是有n种物品,每种物品只能取一个完全背包指的是有n种物品,每种物品可以取无限个多种背包指的是有n种物品,每…

公众号网课搜题接口

公众号网课搜题接口 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击…

常用的在线工具网站

1,在线Photoshop软件 https://www.uupoop.com/ PS在线图片编辑器是一个专业精简的在线ps图片照片制作处理软件工具,绿色免安装,免下载,直接在浏览器打开就可用它修正,调整和美化图像。 2,bilibili视频编辑器 https://bilibili.clipchamp.com/ 由哔哩哔哩…

(保姆级)国内1块钱注册火爆全网的OpenAI-ChatGPT机器人

下面有给出完整的注册流程。首先介绍一下它是什么,如果只想看注册往下翻! 1块钱注册火爆全网的OpenAI-ChatGPT机器人OpengAI-ChatGPT能做什么如何注册1块钱收取验证码使用注册的账号登录ChatGPTOpengAI-ChatGPT能做什么 我作为一个程序员用了一段时间&a…

金蝶云星空生产管理(冲刺学习)

物料“基本”和“生产”相关属性字段介绍 物料属性:生产中常用的物料属性包括自制、委外、外购、虚拟、配置、特征。 自制:一般是指由企业自己生产的物料,一般会建BOM、生产订单; 委外:是指委托给其他加工单位进行加工…

DevTools 无法加载来源映射:无法加载 chrome-extension: 警告的原因以及如何去除(全网最全 最详细解决方案)

是类似这样的一个警告。每次都有看着还是挺难受的。 这个警告的原因是你的浏览器插件造成的。例如警告已经很明确的告诉你是chrome-extension,也就是谷歌插件的问题。后面的字符串其实就是这个插件的id。 chrome-extension://cfhdojbkjhnklbpkdaibdccddilifddb/br…

QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题

需求:我们需要对一个滑动条 滚轮事件 和 点击到滑动条的位置 实时显示 问题:其中在做的时候遇到了很多的问题,一开始感觉很简单,现在将这些问题记录下来 ui图: 问题1:处理QSlider 滚轮事件的时候 这里有…

AlphaFold2源码解析(8)--模型之三维坐标构建

AlphaFold2源码解析(8)–模型之三维坐标构建 这个模块我们讲解AlphaFold的Structure module模块,该结构模块将蛋白质结构的抽象表示映射为具体的三维原子坐标。 Evoformer的单一表征被用作初始单一表征siinitial{s^{initial}_i }siinitial​,siinitial∈…

同步整流 降压恒流 输入4-40V 功率可达40W 电流3.6A 原理图

◆PCB 布线参考PCB 布局应遵循如下规则以确保芯片的正常工作。1:功率线包括地线,LX线和VIN线应该尽量做到短、 直和宽。2:输入电容应尽可能靠近芯片管脚(VIN 和 )。输入电源引脚可增加一个 0.1uF 的陶瓷电容以增强芯片的抗高频噪声能力。3:功…

小迪-day13(MySQL注入)

一、information_schema information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列…

信号和电源隔离的有效设计技术

介绍 如今,电子产品设计师比以往任何时候都更面临着一系列共同的目标:实现更高的吞吐量、更高的分辨率、更高效的系统和缩短上市时间。在工业自动化、医疗电子或电信系统等领域,通常需要电隔离多个信号,以使子系统能够共享数据或…