android 线程间的通信

【Android】Handler之线程间通信 Android多线程之间的消息传递是通过Handler来实现的。不同的线程之间又分为两类:即Main Thread(主线程)和Worker Thread(”苦力“线程) 。 Main Thread又称为UI Thread,意思是主线程负责Android App的界面管理与显示和与用户之间的交互,是最重要的也是最核心的Thread,所以我们要对它细心呵护, 如果处理不当使UI Threa 阅读详情
 近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子。

 andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。

在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle,我们有消息循环,就要往消息循环里 面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,消息的的处理,把这些都封装在Handle里面,注意Handle只是针对那 些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。
但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。

  在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个是android的新概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handler,我们有消息循环,就要往消息循环里面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,把这些都封装在Handler里面,注意Handler只是针对那 些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。

但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。

  一个Handler的创建它就会被绑定到这个线程的消息队列中,如果是在主线程创建的,那就不需要写代码来创建消息队列了,默认的消息队列会在主线程被创建。但是如果是在子线程的话,就必须在创建Handler之前先初始化线程的消息队列。如下面的代码:

01class ChildThread extends Thread {
02 
03public void run() {
04 
05/*
06* 创建 handler前先初始化Looper.
07*/
08Looper.prepare();
09 
10/*
11* 在子线程创建handler,所以会绑定到子线程的消息队列中
12*
13*/
14mChildHandler = new Handler() {
15 
16public void handleMessage(Message msg) {
17 
18/*
19* Do some expensive operations there.
20*/
21}
22};
23 
24/*
25* 启动该线程的消息队列
26*/
27Looper.loop();
28}
29}

当Handler收到消息后,就会运行handleMessage(…)的回调函数,可以在里面做一些耗时的操作。


最后完成了操作要结束子线程时,记得调用quit()来结束消息循环队列。

1mChildHandler.getLooper().quit();

下面是一个线程间通信的小例子:

 

001/**
002*
003* @author allin.dev
005*
006*/
007public class MainThread extends Activity {
008 
009private static final String TAG = "MainThread";
010private Handler mMainHandler, mChildHandler;
011private TextView info;
012private Button msgBtn;
013 
014@Override
015public void onCreate(Bundle savedInstanceState) {
016super.onCreate(savedInstanceState);
017setContentView(R.layout.main);
018 
019info = (TextView) findViewById(R.id.info);
020msgBtn = (Button) findViewById(R.id.msgBtn);
021 
022mMainHandler = new Handler() {
023 
024@Override
025public void handleMessage(Message msg) {
026Log.i(TAG, "Got an incoming message from the child thread - "
027+ (String) msg.obj);
028// 接收子线程的消息
029info.setText((String) msg.obj);
030}
031 
032};
033 
034new ChildThread().start();
035
036
037msgBtn.setOnClickListener(new OnClickListener() {
038 
039@Override
040public void onClick(View v) {
041
042if (mChildHandler != null) {
043
044//发送消息给子线程
045Message childMsg = mChildHandler.obtainMessage();
046childMsg.obj = mMainHandler.getLooper().getThread().getName() + " says Hello";
047mChildHandler.sendMessage(childMsg);
048
049Log.i(TAG, "Send a message to the child thread - " + (String)childMsg.obj);
050 
051 
052}
053}
054});
055 
056}
057 
058public void onDestroy() {
059      super.onDestroy();
060Log.i(TAG, "Stop looping the child thread's message queue");
061 
062mChildHandler.getLooper().quit();
063}
064 
065class ChildThread extends Thread {
066 
067private static final String CHILD_TAG = "ChildThread";
068 
069public void run() {
070this.setName("ChildThread");
071 
072//初始化消息循环队列,需要在Handler创建之前
073Looper.prepare();
074 
075mChildHandler = new Handler() {
076@Override
077public void handleMessage(Message msg) {
078Log.i(CHILD_TAG, "Got an incoming message from the main thread - " + (String)msg.obj);
079 
080 
081try {
082 
083//在子线程中可以做一些耗时的工作
084sleep(100);
085 
086Message toMain = mMainHandler.obtainMessage();
087toMain.obj = "This is " + this.getLooper().getThread().getName() +
088". Did you send me \"" + (String)msg.obj + "\"?";
089 
090mMainHandler.sendMessage(toMain);
091 
092Log.i(CHILD_TAG, "Send a message to the main thread - " + (String)toMain.obj);
093 
094} catch (InterruptedException e) {
095// TODO Auto-generated catch block
096e.printStackTrace();
097}
098}
099 
100};
101 
102Log.i(CHILD_TAG, "Child handler is bound to - "+ mChildHandler.getLooper().getThread().getName());
103 
104//启动子线程消息循环队列
105Looper.loop();
106}
107}
108}
 
 
C# WPF多页面间的数据共享(经典) 实现页面间的数据共享有很多方法,比如:①事件的发布订阅 ②委托③ioc容器④静态类等,这节主要通过静态的集合实现数据的添加和获取。 阅读详情

相关推荐

工作:三菱PLC与伺服之CC-Link IE Field Network通讯应用

CC-LINK-IE

好记性不如烂笔头 2万+

Android开发之异步详解(一)Thread+Handler

在Android实际开发工程中经常会进行一些诸如:文件读写、访问网络等耗时的操作,这些耗时的操作是不建议放到UI线程里的。所以我们会新开一个线程,在子线程中进行这些耗时的操作,耗时操作过程中,UI经常需要更新,但Android是不允许在子线程中修改UI的。所以就出现了Thread+Handler机制,Thread通过handler向主线程发送消息、传递数据,来更新UI。下面就介绍如何通过Thread+Handler方式实现异步操作。

fengyuzhengfan的专栏 3721

[pytorch]FixMatch代码详解(超详细)

FixMatch代码详解-训练过程参数数据产生构建模型训练参数设置weight decay(权值衰减)学习率衰减(learning rate decay)指数移动平均(EMA)model训练过程运行结果 上一篇大概讲了数据加载的过程,这一篇更进一步,分析一下训练是怎样进行的 上一篇链接: [pytorch]FixMatch代码详解-数据加载 参数 所有的参数我都默认使用作者给出的例子: python train.py --dataset cifar10 --num-labeled 4000 --arch w

qq_38736504的博客 1万+

Android线程问题解决——Thread+Handler的使用和AsyncTask的使用(外加安卓进度条的代码实现)

文章目录问题引入线程知识  主线程(UI线程)  子线程解决方案  一,使用Thread+Handler处理     1.概念     2.流程图     3.过程概述     4.代码实现  二,用AsyncTask处理     1.概念(异步执行的四个方法)     2.流程图     3.AsyncTask异步任务使用时的注意事项     4.AsyncTask异步任务代码实现进度条总结 问题引入  Android用户界面是与用户交互的接口,对于用户的操作,Android迅速响应用户输入(200ms内

qq_43107850的博客 3381

电拖笔记1电磁学基本知识与定律

电拖学习

qq458629839的博客 1131

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 326

invoke 数组_第九节:深究并行编程三大方法 (For、ForEach、Invoke)

一. 并行编程1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行。(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的优势,同时开启多个线程并行执行。(典型代表Parallel.For循环 下面例子从1-100无序执行) 代码实践: 1 { 2 //1. 串行 (从1-100按顺序执行) 3 for (int i = ...

weixin_39874196的博客 288

1104全部报表版本号-银监会报表

G4B_Ⅲ(a)X1《与非中央交易对手的衍生具交易对手信用风险违约风险计算表(现期风险暴露法)(第一档)》G4B_Ⅲ(b)X1《与非中央交易对手的证券融资交易对手信用风险违约风险计算表(权重法)(第一档)》G4B_Ⅲ(a1)X2《与非中央交易对手的衍生具交易对手信用风险违约风险计算表(标准法)(第二档)》Ⅲ(a)X2《与非中央交易对手的衍生具交易对手信用风险违约风险计算表(现期风险暴露法)(第二档)》Ⅲ(a1)X1《与非中央交易对手的衍生具交易对手信用风险违约风险计算表(标准法)(第一档)》

数字化老司机 6286

Android 线程消息循环机制

android.os.Looper: Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息。 注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler....

weixin_34071713的博客 283

Synares病毒实战:如何从U盘感染中恢复你的Excel和EXE文件(附专杀工具推荐)

本文详细介绍了Synares感染型病毒的典型特征与传播机制,特别是其通过U盘感染Excel和EXE文件的行为。文章提供了一套从应急隔离、诊断到使用专杀工具进行深度清除与文件恢复的完整实战流程,并推荐了有效的安全软件和修复方法,旨在帮助用户最大程度救回重要数据并构建长效安全防护习惯。

weixin_29230649的博客 1812

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023年7月,瑞士洛桑联邦理工学院的Hongkeng Zhu和Elison Matioli在《IEEE Transactions on Power Electronics》期刊发表文章,提出了一种稳态测量方法,用于研究氮化镓(GaN)高电子迁移率晶体管(HEMT)的动态导通电阻(Ron)。实验结果显示,商业GaN器件在稳态下的动态Ron变化显著,稳定时间可达数分钟且与电压相关。传统的脉冲测量方法由于测试时间不足,可能导致结果不准确。该

荷塘阅色 1376

android 循环机制,消息循环机制及其原理

一、什么是消息循环消息循环概述:Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环,通过消息循环可实现线程间通信。在Android线程内,可以通过消息循环的机制以队列的方式实现消息的发送,处理等工作作用:线程间通信涉及到的核心类:Message:消息的实体的封装Handler:消息的发送和处理Looper:消息循环的核心,管理消息队列,实现与当前线程绑定MessageQ...

weixin_30320771的博客 846

【数据湖仓】:Iceberg、Hudi 和 Paimon 对比

适用于需要多计算引擎支持和复杂查询的离线批处理场景。其中立性和灵活性使其成为构建新型数据平台的理想选择。:在需要高频数据更新和高效小文件管理的场景中表现出色,适合实时数据处理和增量数据更新的业务需求。:专为实时流式数据处理设计,适用于对数据实时性要求高的业务场景,如实时数据分析和实时指标监控。通过以上分析,可以看出 Apache Iceberg、Apache Hudi 和 Apache Paimon 各有其独特的优势和适用场景。企业应根据自身业务需求和技术栈选择合适的数据湖仓方案,以充分发挥其价值。

欢迎来到我的博客,一起探索代码里的世界! 1607

android线程间通信的几种方法_Android线程间通信机制

讲解Handler机制的博文很多,我也看了很多,但说实话,在我对Handler几乎不怎么了解的情况下,每一篇文章我都没太看懂,看完之后脑子里还是充满了疑问。究其原因,是因为几乎每一篇文章一上来就开始深入Handler源码,使得在一些宏观的问题上还是充满疑问,如果你从来没接触过Handler,对一些基础的问题还充满疑问,那深入源码去探究根源肯定会有些吃力。下面,我就从一个初学者思考的角度,来讲一讲H...

weixin_36316291的博客 2045

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android线程间通信方式深度解析

在Android开发中,线程间通信(IPC)是处理多线程协作的核心技术。Android提供了多种线程通信机制,各有特点和适用场景。

斗锋在干嘛的博客 1165

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android线程间通信

Android线程间通信 前言:内容主要从android线程间通信方式进行入手,首先分析了线程间通信的几种方式,再深入分析线程间通信的机制,主要分析工作线程与工作线程间通信,因为主线程和工作线程间通信网上已经很多例子了。 目录 Android线程间通信 一、Android线程间通信的四种实现方式 1.Handler进行线程通信==>消息机制 2.runOnUiThread 3.View.post(Runnable r) 4.AsyncTask 二、线程间通信机制 一、Andr.

居家小男的博客 1683

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android线程间通信全面解析

如LinkedBlockingQueue实现生产者-消费者模式。:用于子线程与主线程通信,底层通过MessageQueue实现。:使用synchronized或Lock保证线程安全。:Binder/Messenger用于进程间通信。:Android 11后已废弃,推荐使用。符合Android的单线程UI模型。:挂起代替阻塞,提高CPU利用率。:Kotlin的轻量级通信管道。:通过作用域自动管理生命周期。:一个线程可运行数千协程。:用同步写法实现异步逻辑。类:无锁CAS操作(如。:可中断、公平锁选项。

斗锋在干嘛的博客 1446

android线程间通信的几种方法_Android进程间和线程间通信方式

进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一些在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。区别:(1)、一个程序至少有一个进程,一个进...

weixin_35915157的博客 6399

安卓线程间通信

HandlerHandler 是 Android 提供的用于线程间通信的工具,主要用于在主线程(UI线程)和其他线程之间传递消息和执行任务。它通过消息队列(MessageQueue)和 Looper 机制(轮询机制),实现线程间通信。Handler 可以在一个线程中发送和处理消息,从而在不同的线程之间传递数据或执行任务。Handler使用//在主线程中创建 Handler,并指定与主线程关联的 Looper。 Handler handler = new Handler(Looper.getMainLoope

qq_62618558的博客 945

Android消息机制 & Android线程间通信机制

前言:由于Android系统本身决定了其自身的单线程模型结构。在日常的开发过程中,我们又不能把所有的工作都交给主线程去处理(会造成UI卡顿现象)。因此,适当的创建子线程去处理一些耗时任务是非常关键的。同时Android中非UI线程不能对UI组件进行操作,因此,熟练的掌握并应用线程间消息通信是很有必要的。接下来,我们从Android线程间通信机制和Android消息机制两个方面对以上内容进行介绍。 ...

白哥哥的博客 3149

Android之进程间和线程间通信方式

首先介绍一下进程和线程的基本概念及两者之间的区别:   进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。   线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 线程自己基本上不拥有系统资源,只拥有一些在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。 区别: (1)一个程序至少有一个进程,一个进程至少有一个线程; (2)线程的划分尺度小于进

xuyin1204的博客 3353

安卓中的几种线程间通信方式

一:Handler实现线程间的通信          andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。 在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 ...

small_and_smallworld 1万+

Android线程间通信机制

Android线程间通信机制 当android应用程序运行时,一个主线程被创建(也称作UI线程),此线程主要负责处理UI相关的事件,由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作,如果在非UI线程直接对UI进行了操作,则会报错,另外,对于运算量较大的操作和IO操作,我们需要新开线程来处理这些工作,以免阻塞UI线程,子线程与主线程之间是怎样进行通信的呢?此时就要采用

眼睛一闭一睁一天就过去了哼,眼睛一闭不睁一辈子就过去了哼。 3万+

Android 线程间通信

Android 线程间通信

QYgujingjing的专栏 2326
上一篇: Android进程间通信(IPC)机制Binder简要介绍
下一篇: 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法
androidboy365
博客等级 码龄16年 35粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值