Android 子线程无法刷新UI界面
问题:在Android开发中,子线程无法直接更改UI界面视图的刷新
这个时候 Handler 起到了至关重要的作用.
简单来说 , Handler就是用来传递消息的.
Handler可以当成子线程与主线程的消息传送的纽带。
在安卓开发中,在子线程中无法刷新UI,是因为UI在子线程中刷新的话,是不安全的,如 多个线程刷新UI,会造成UI更新冲突,这样是不安全的。
所以,Handler的作用就来了,子线程可以通过Handler来将UI更新操作切换到主线程中执行. 话不多说 上代码:
//这里需要实现 View.OnClickListener 接口
public class Test extends AppCompatActivity implements View.OnClickListener { TextView textView; Thread myThread; Button buttonStart @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //获取文本视图
textView = findViewById(R.id.textView); //创建线程
myThread = new TimeThread(); //获取开始按钮
buttonStart = findViewById(R.id.but_start); //开始按钮单击事件
buttonStart.setOnClickListener(this); }
//重写onClick方法
@Override
public void onClick(View v) {
//判断当前按的控件
switch (v.getId()) {
case R.id.but_start:
//开启线程
myThread.start();
break;
default:
break;
}
} } public class TimeThread extends Thread {
//重写run方法
@Override
public void run() {
super.run();
//一直循环
while (true) {
try {
//每秒执行一次
Thread.sleep(1000);
Message msg = new Message();
//
msg.what = 1;
//获取当前系统时间
Date date= new Date();
SimpleDateFormat dateFormat = new
SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String now= dateFormat.format(date);
//把时间放入Message
msg.obj = now ;
//由Message传递给Handler 处理
myHandler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
break; }
}
}
} private Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
//更新文本框里的值
textView.setText((String)msg.obj);
break;
default:
break;
}
}
};
Android 子线程无法刷新UI界面的更多相关文章
- Android子线程中更新UI的4种方法
方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...
- 老问题:Android子线程中更新UI的3种方法
在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handle ...
- Android 子线程中进行UI操作遇到的小问题
今天在学习<第一行Android代码>第9章-子线程进行UI操作时遇到了一些问题. 代码是这样的: ... import java.util.logging.Handler; ... pu ...
- Android 子线程 UI 操作真的不可以?
作者:vivo 互联网大前端团队- Zhang Xichen 一.背景及问题 某 SDK 有 PopupWindow 弹窗及动效,由于业务场景要求,对于 App 而言,SDK 的弹窗弹出时机具有随机性 ...
- 为什么我的子线程更新了 UI 没报错?借此,纠正一些Android 程序员的一个知识误区
开门见山: 这个误区是:子线程不能更新 UI ,其应该分类讨论,而不是绝对的. 半小时前,我的 XRecyclerView 群里面,一位群友私聊我,问题是: 为什么我的子线程更新了 UI 没报错? 我 ...
- 03_主线程联网问题&ANR&子线程不能修改UI
如果不使用HAXM,恐怕网页源码查看器无法获取servlet的源码.初步猜测是安卓模拟器运行速度太慢了.如果CPU不支持VT-x的话,HAXM是安装不上的.所以可以先开启VT-x. 可以参考几篇文章h ...
- Android子线程真的不能更新UI么
Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.run ...
- Android子线程更新UI的方法总结
版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...
- android子线程更新UI
参考:https://www.cnblogs.com/joy99/p/6121280.html 子线程是不能直接更新UI的.Android实现View更新有两组方法,分别是invalidate和pos ...
随机推荐
- Java架构师面试题——JVM性能调优
JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...
- 洛谷 P2820 局域网x
题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象.因为连 ...
- Sonar页面Author页面展示
文主要记录通过Jenkins集成git .svn .sonarqube,获取源码后自动构建进行sonar scanner代码审查,并分析在sonar能够展示Author的原因. 一.Sonar通过je ...
- H5 video全屏与取消全屏兼容
H5 video全屏与取消全屏各浏览器兼容, requestFullscreen()全屏方法,exitFullscreen()退出全屏方法.兼容各个浏览器与css3兼容一样加个前缀即可. // 全屏 ...
- 前端js图片上传
前端js图片上传,原理用input type="file"获取图片然后把图片转换成base64编码传到后台. 图片上传 <!DOCTYPE html><html& ...
- C_clock()测试代码(循环)运行时间
clock() 传送门(百度百科) clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下: clock_t clock(voi ...
- Hadoop监控指标项
配置 修改$HADOOP_HOME/etc/hadoop/hadoop-env.sh # 在配置namenode和datanode时都会有用到JMX_OPTS的代码,是为了减少重复提取出的公共代码 e ...
- docker容器的学习
什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源 ...
- C++入门经典-例2.16-隐式类型转换
1:代码如下: // 2.16.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using ...
- 20175215 2018-2019-2 第五周java课程学习总结
第六章学习内容 1.接口 使用interface来定义一个接口. 接口体中包含常量的声明(没有变量)和抽象方法两部分.接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量的访问权限一定都是pu ...