Android Handler主线程和一般线程通信的应用分析
发布时间:2022-10-29 14:08:13
Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭"。这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。这个时候,Handler就出现了来解决这个复杂的问题。由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接收子线程传过来的(子线程用sedMessage()方法传递)Message对象,(里面包含数据) , 把这些消息放入主线程队列中,配合主线程进行更新UI。
Handler一些特点
handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)。
它有两个作用: (1)、安排消息或Runnable在某个主线程中某个地方执行;(2)安排一个动作在不同的线程中执行。
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.
要更改UI界面内容只能在主线程里面进行,下面是一个实现在Android中,动态更改UI界面的内容:先启动一个线程timer,此线程负责对UI进行动态更改的具体操作,此外,再定义一个线程来负责主线程和timer线程的通信,此线程就是Handler!它是Runnable和Activity交互的桥梁。
步骤:
1、在MainActivity中定义操作Title具体实现
private int title = 0;
protected void updateTitle() {setTitle("welcome to Livingstone's blog" + title);// MainActivity中更新Title方法title++;}
2、在MainActivity中定义一个Handler,用于更新Title
private Handler changeTitleHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:updateTitle();break;}}};
3、在MainActivity中定义一个TimerTask类型内部类,此Task继承自Runnable!
private class Mytack extends TimerTask {// public abstract class TimerTask implements Runnable{}@Overridepublic void run() {Message msg = new Message();msg.what = 1;changeTitleHandler.sendMessage(msg);}}
4、在MainActivity的onCreate方法中添加一个定时器
Timer timer = new Timer();timer.scheduleAtFixedRate(new Mytack(), 1, 5000);// 方法详解 Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)
* @param task | the task to schedule.
* @param delay | amount of time in milliseconds before first execution.
* @param period | amount of time in milliseconds between subsequent executions.
OK!
执行此Activity,会看到一个Title动态更新的程序。
Handler的使用场合:
1、 to schedule messages and runnables to be executed as some point in the future;
安排messages和runnables在将来的某个时间点执行。
2、 to enqueue an action to be performed on a different thread than your own.
将action入队以备在一个不同的线程中执行。即可以实现线程间通信。比如当你创建子线程时,你可以在你的子线程中拿到主线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。
1)、创建Handler对象(此处创建于主线程中便于更新UI)。
2)、构建Runnable对象,在Runnable中更新界面。
3)、在子线程的run方法中向UI线程post,runnable对象来更新UI,Handler.post(Runnable runa)。


猜你喜欢
- 本文实例讲述了Android编程设计模式之原型模式。分享给大家供大家参考,具体如下:一、介绍原型模式是一个创建型的模式。原型二字表明了该模型
- 本文实例为大家分享了android自定义View实现五子棋的具体代码,供大家参考,具体内容如下先说一下吧,android的自定义View就是
- mq是实现代码扩展的有利手段,个人喜欢用概念来学习新知识,介绍堵塞问题的之前,先来段概念的学习。ConnectionFactory:创建co
- 问题现象今天在做一个需求:将存入数据库中的数据读到后解析成list遍历分析数据格式:"[1677660600000, 167766
- 若要在 C++ 中实现异常处理,你可以使用 try、throw 和 catch 表达式。首先,使用 try 块将可能引发异常的一个或多个语句
- 目录了解程序集如何在C#.NET中加载程序集,模块和引用.NET中的程序集绑定绑定重定向当问题开始发生时故障排除边注References了解
- 为什么要用Jupyter Notebook推荐新手写python用什么编辑器就有有人问:为什么没有Jupyter Notebook。本来想数
- 小米系统自带的长截屏应该很多人都用过,效果不错。当长截屏时listview就会自动滚动,当按下停止截屏时,就会得到一张完整的截屏。该篇就介绍
- 一、 测试代码:二、添加参数1、在终端工具中①先编译: javac Test.java②再运行: java Test args1 args2
- 本文以实例形式详细讲述了Java的反射机制,是Java程序设计中重要的技巧。分享给大家供大家参考。具体分析如下:首先,Reflection是
- 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net包中J2SE的API包含有类和接口,它们提供低层
- RestTemplate设计是为了Spring更好的请求并解析Restful风格的接口返回值而设计的,通过这个类可以在请求接口时直接解析对应
- 预期当前安卓的所有proto都生成在一个module中,但是其实业务同学需要的并不是一个大杂烩, 只需要其中他们所关心的proto生成的类则
- DataTable可以通过RowStatus来判断状态是否发生了改变。但是有些时候我们希望在行状态即使为Modified的情况下也不要提示内
- 有时候我们从数据库中查询出来数据之后,需要按照DataTable的某列进行分组,可以使用下面的方法实现,代码如下:using System;
- 本文实例为大家分享了Java实现生成n个不重复的随机数的具体代码,供大家参考,具体内容如下需求:根据min和max,生成n个不重复的随机数。
- 前言:$是c# 6.0 的语言特性,功能类似string.format(),更方便的地方在于不要像format一样使用索引,可以直接使用变量
- 扫码抢实现读取二维码信息,本地扫码枪是外接写入设备,本质是监控读写输入,下面介绍下扫码设备读取支付二维码。1.引入扫码设备辅助类public
- 一、先看结果1.1创造营2020撑腰榜前三甲创造营2020撑腰榜前三名分别是 希林娜依·高、陈卓璇 、郑乃馨>>>df1[
- 本文实例讲述了java数据结构与算法之中缀表达式转为后缀表达式的方法。分享给大家供大家参考,具体如下://stackpublic class