Android使用Handler和Message更新UI
作者:Fndroid 发布时间:2023-01-13 21:22:21
标签:Android,Handler,Message,UI
在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,所以当我们需要在非主线程中更新UI控件,那么就需要用到Handler和Message来实现
Demo中,使用到一个按钮和一个TextView,点击按钮之后改变TextView的内容,按钮点击时候新建一个进程,在进程中对UI控件进行修改。
public class MainActivity extends Activity implements OnClickListener {
private static final int UPDATE_TEXT = 1;
private Button send;
private TextView tv;
private Handler hd = new MyHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
send = (Button) findViewById(R.id.bt_sendMessage);
tv = (TextView) findViewById(R.id.tv_text);
send.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_sendMessage:
new Thread(new Runnable() {
@Override
public void run() { //新建一个线程,并新建一个Message的对象,是用Handler的对象发送这个Message
Message msg = new Message();
msg.what = UPDATE_TEXT; // 用户自定义的一个值,用于标识不同类型的消息
hd.sendMessage(msg); // 发送消息
}
}).start();
break;
default:
break;
}
}
// 定义一个内部类继承自Handler,并且覆盖handleMessage方法用于处理子线程传过来的消息
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case UPDATE_TEXT: // 接受到消息之后,对UI控件进行修改
tv.setText("修改成功!");
break;
default:
break;
}
}
}
}
理解:先在主活动中定义一个内部类,并继承自Handler,并且覆盖Handler中的handleMessage方法,这个方法在Handler中是一个空方法,便于我们自定义消息的内容。然后在onCreate方法中,获取Button并且添加点击事件,在事件中添加一个线程,在线程中,使用Message类封装一个消息,然后用Handler的对象发送这个消息,Handler对象的handleMessage方法就会被调用,达到改变TextView的内容的效果。


猜你喜欢
- C#过滤DataTable中的空数据和重复数据string sql = "select name,age from user&qu
- 本文研究的主要是Java中hashCode的正确求值方法的相关内容,具体如下。散列表有一项优化,可以将对象的散列码(hashCode)缓存起
- 本文介绍idea的安装和基本使用首先保证JDK正常安装及配置下载地址:https://www.jetbrains.com/idea/down
- 一、介绍1、"Lambda表达式"是一个特殊的匿名函数,简化了匿名委托的使用,是一种高效的类似于函数式编程的表达式,La
- Android为我们提供了竖直方向的滚动控件GridView,但如果我们想让它水平滚动起来,就需要自己实现了。以下使用的测试数据datas集
- 本文实例为大家分享了使用C#写出一个简单的记事本程序,供大家参考,具体内容如下编程语言: C# 编程环境: Visual Studio 20
- 一、实现方式@ConfigurationProperties 注解(最好加上前缀prefix=“person”,标明是和配置文件中哪个开头的
- java多线程-同步块Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java 同步块用来避免竞争。
- Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RF
- 1.在实体类中添加@TableId注解:2.在navicat中设置id自动增长:3.测试一下,当我们再次插入的时候,就会看到id4.对注解中
- 前言:线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据
- 概述:开发过程中,看到有些界面用到一道光线在屏幕中掠过的效果,觉得挺炫的。所以查找相关资料自己实现了一遍。先上个预览图:实现思路:简单来说就
- 最近一段时间在研究OAuth2的使用,想整个单点登录,从网上找了很多demo都没有实施成功,也许是因为压根就不懂OAuth2的原理导致。有那
- 本文实例讲述了C#更改tabControl选项卡颜色的方法。分享给大家供大家参考,具体如下:private void Form1_Load(
- 今天看到一个银行的APP上面的loadingview 挺好的,就尝试着自己实现,觉得很简单,但自己实现起来还是发现了一些问题。Loading
- 本文实例为大家分享了Java实现宠物商店管理的具体代码,供大家参考,具体内容如下第一种实现方式:抽象类和对象数组public abstrac
- Java中的BigDecimal类的使用:使用Java中的BigDecimal可以进行精确的计算,但是在使用BigDecimal时我们需要注
- 为大家分享的解决MyEclipse中的Building workspace问题的方法如下方法一:点击“Project”,取消勾选“Build
- 关于jmeter中的正则表达式及json提取器可以提取响应值,大家都有所了解,但是往往我们在实际运用中,可能需要上个接口的多个响应值,难道我
- 动态规划算法动态规划算法的思想动态规划算法处理的对象是多阶段复杂决策问题,动态规划算法和分治算法类似,其基本思想也是将待求解问题分解成若干个