Android之线程的简单使用

2024-05-09 10:32
文章标签 android 线程 简单 使用

本文主要是介绍Android之线程的简单使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注意

本文章只讲使用原生android来达到开启线程的目的

使用简单线程的三种方法

第一种,继承Thread,重写run

代码

    class TestThread extends Thread {@Overridepublic void run() {/*逻辑代码*/}}

然后new TestThread().start();这样就会在开辟出来的线程中执行run方法,如果想让run方法一直执行,需要在run中加上while(true)
采用继承的方式,耦合度高一些

第二种,实现Runnable

代码

    class TestThread implements Runnable {@Overridepublic void run() {/*逻辑代码*/}}
然后new Thread(new TestThread()).start();
注意的是这里实际上是new TestThread()这个实现Runnable的类,然后把这个类传入Thread
看一下源码可以知道,内部保存TestThread,然后默认的Thread run方法执行TestThread的run方法

第三种匿名类的方式

代码

        new Thread(new Runnable() {@Overridepublic void run() {/*逻辑代码*/}}).start();

第四种,使用lamba

代码

        new Thread(()->{/*逻辑代码*/}).start();
不得不说,lamba还真是方便

以上都是常规的思路

我们都知道更新UI只能在主线程,所以每当我们子线程有了需要更新的需求,就要给到主线程,android为我们提供了异步处理消息机制
代码

public class MainActivity extends AppCompatActivity {private static final int PRE = 0;private static final int NOW = 1;private Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case PRE:Log.d("CHAO", "handleMessage PRE thread = " + getLooper().toString());break;case NOW:Log.d("CHAO", "handleMessage NOW thread = " + getLooper().toString());break;default:Log.d("CHAO", "handleMessage xx");break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d("CHAO", "onCreate");new Thread(()->{while(true) {Message message = new Message();message.what = PRE;handler.sendMessage(message);try {sleep(1000);}catch (InterruptedException e) {}}}).start();}   
实现线程中handler发送信息,然后handler的handleMessage主线程接收

来看几个名词,这之间经历的什么过程
Message:
是一个消息类型,Handle使用Message传递信息,Message内部有常用四个成员,what类型Object存储对象,arg1 arg2 类型int存储少量数字,what类型int,一般用来存储消息类型
Handler:
异步消息处理的核心,使用sendMessage()发送信息,handleMessage处理信息
MessageQueue:
消息队列,存放所有通过Handler发送的信息,这部分消息一直存在消息队列,然后一个一个被拿出来,在handleMessage处理。相当于一个缓冲区
Looper:
MessageQueue是存信息的,那么肯定得有人把这个信息拿出来放到handleMessage执行啊,就是Looper,不断从MessageQueue取信息放到handleMessage执行
来一张经典的图:

以上就是最最基础最最简答的线程整理

这篇关于Android之线程的简单使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973156

相关文章

C:单链表的简单实现

前言 今天整理资料的时候翻出来的文件,发现是以前学习数据结构的时候写的代码,当初是看郝凯老师的视频学习的C语言的数据结构,下面是对于一个单链表的简单的实现。 /*******************************************************************************@file SingleLinker.c*@version V1.0

C:简单实现BaseCode64编码

What is Base64? 前言 目前来看遇到过Base 16、Base 32、Base 64的编解码,这种编码格式是二进制和文本编码转化,是对称并且可逆的转化。Base 64总共有64个ASCII码字符,包括A-Z,a-z,0-9,“+”和“/ ”。详细介绍可以参考了这篇文章,对Base 64的原理做了比较详细的介绍。 编码原理 转换 Base 64编码的64个ASCII字符需要6

Android 电池管理系统架构总结 Android power and battery management architecture summaries

文章目录 1 整体架构2 设计构架2.1 driver2.1.1 Charger.ko2.1.2 Battery.ko 2.2 power supply2.2.1 基础架构2.2.2 代码分析 2.3 healthd2.3.1 基础架构2.3.2 init2.3.4 update 2.4 framework 3 总结参考 1 整体架构 Android的电池架构包括从顶层用户使用

repo使用总结—从入门到入门

文章目录 1 what's repo2 官方文档Repo 命令参考资料help 帮助init 初始化sync 同步所有项目文件upload 提交更改diffdownloadforallprunestart 创建本地分支Example:创建三个分支test-1,test-2,test-3 statusbranchesabandonExample:删除本地分支test-3 后续在使用中遇到问题

STM8内部EEPROM的使用详解

1 内存映射 STM8S105集成了多达1K的EEPROM(掉电数据不会丢失)最高可以支持30万次的擦写次数,用户可以将一些数据保存在EEPROM中,具体的memory map如下图所示; 在这里内存一页的大小为64 bytes(1 block), DATA EEPROM的内存地址映射如下图所示; 可以看到,EEPROM的起始地址为0x004000,结束地址为0x00427F,这个在

Linux内核中container_of的原理及其使用详解

文章目录 前言宏定义如何使用简单分析typeofoffsetof 写在最后 前言 在进行内核驱动开发的时候,经常可以看到container_of的身影,其作用就是获取包含某个成员的结构体变量地址,函数原型如下所示; #define container_of(ptr, type, member) ({ \const typeof( (

看似简单的代码,却暗藏玄机...

点击上方“小麦大叔”,选择“置顶/星标公众号” 福利干货,第一时间送达 能从PC机器编程去看嵌入式问题,那是第一步; 学会用嵌入式编程思想,那是第二步; 用PC的思想和嵌入式的思想结合在一起,应用于实际的项目,那是第三步。 很多朋友都是从PC编程转向嵌入式编程的。 在中国,嵌入式编程的朋友很少是正儿八经从计算机专业毕业的,都是从自动控制啊,电子相关的专业毕业的。 这些童鞋们,实践经验雄厚,但是理

[SCF+wetest+jmeter]云性能压测工具使用方案

前言 压测太难?局域网压力无法判断服务器网络指标?无法产生非常大的并发量?云性能太贵? 也许我们可以把各种简单的工具拼起来进行压力测试! 准备 https://cloud.tencent.com/product/scf https://cloud.tencent.com/product/lm 云压测背景 常规压测工具,所有请求均从本地出发,走局域网可能导致网络请求的实际效果不够真实

IDEA中使用maven配置mybatis-------mybatis(一)

IDEA下通过maven配置mybatis 创建maven项目,路径为:file–setting-maven–maven-archetye-webapp; 创建mybatis目录,按箭头所示依次点击,创建一个mybatis的文件编写目录 修改pom.xml配置文件,刚开始可能红框中的字体为红色,等待maven自动下载完成之后即可 mysql客户端配置 添加log4j <

vue3.0 v-model 的使用

前言 组件功能:把 el-switch 的值 false/true, 动态绑定输出为 0, 1 组件代码 封装el-switch组件,当el-switch的值为false,输出值为0;当el-switch的值为true,输出值为1; <template><el-switch v-model="switchValue" @change="changeEvent"></el-switch