Android使用Handler和Message更新UI
作者:Fndroid 时间:2023-01-13 21:22:21
在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的内容的效果。
标签:Android,Handler,Message,UI
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
WPF弹出自定义窗口的方法
2023-10-18 20:52:04
普通类注入不进spring bean的解决方法
2021-06-07 19:22:41
![](https://img.aspxhome.com/file/2023/9/125659_0s.png)
java写的伪微信红包功能示例代码
2023-07-05 00:24:23
基于java中两个对象属性的比较
2023-08-23 05:25:02
Android实现自动匹配关键字并且标红功能
2023-05-29 06:19:28
C++求四个正整数最大公约数的方法
2023-02-04 12:09:19
![](https://img.aspxhome.com/file/2023/9/114929_0s.jpg)
Java字符串查找的三种方式
2023-11-18 22:00:30
Spring 事务事件监控及实现原理解析
2023-12-24 04:20:20
C# 通过反射初探ORM框架的实现原理(详解)
2023-08-30 20:05:30
Android实现捕获TextView超链接的方法
2021-07-03 08:44:04
![](https://img.aspxhome.com/file/2023/2/116042_0s.jpg)
C# 实现颜色渐变窗体控件详细讲解
2021-12-31 07:10:28
使用GPS经纬度定位附近地点(某一点范围内查询)
2023-08-22 18:49:09
c# 进程之间的线程同步
2023-07-05 06:34:23
java身份证合法性校验工具类实例代码
2022-09-10 18:36:55
C# 用什么方法将BitConverter.ToString产生字符串再转换回去
2021-10-07 17:49:40
Java方法的覆盖与隐藏的区别分析
2021-12-19 05:15:52
解决Map集合使用get方法返回null抛出空指针异常问题
2023-11-25 00:14:00
![](https://img.aspxhome.com/file/2023/8/59848_0s.png)
Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析
2022-03-21 05:25:23
![](https://img.aspxhome.com/file/2023/2/84692_0s.png)
Android 自定义标题栏的实例详解
2021-11-06 00:53:04
android开发教程之startActivityForResult使用方法
2022-04-03 13:46:16