利用Handler定时更新Android UI

在 Android 里定时更新 UI,通常使用的是 java.util.Timer, java.util.TimerTask, android.os.Handler 组合,这里有相关的讨论。但实际上 Handler 自身已经提供了定时的功能。 

参考 android.os.Handler 的文档 

引用

There are two main uses for a Handler:  (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own. 


Scheduling messages is accomplished with the post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long) methods. The post versions allow you to enqueue Runnable objects to be called by the message queue when they are received; the sendMessage versions allow you to enqueue a Message object containing a bundle of data that will be processed by the Handler's handleMessage(Message) method (requiring that you implement a subclass of Handler). 


When posting or sending to a Handler, you can either allow the item to be processed as soon as the message queue is ready to do so, or specify a delay before it gets processed or absolute time for it to be processed.  The latter two allow you to implement timeouts, ticks, and other timing-based behavior. 


下面是一个简单的计数器程序,每隔一秒递增计数器 

 

代码 

main.xml 
-------- 
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <TextView android:id="@+id/counter" android:layout_width="fill_parent"  
  6.         android:layout_height="wrap_content" android:text="Count: 0" />  
  7.     <LinearLayout android:orientation="horizontal"  
  8.         android:layout_width="fill_parent" android:layout_height="wrap_content">  
  9.         <Button android:text="start" android:id="@+id/Button01"  
  10.             android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1.0"></Button>  
  11.         <Button android:text="stop" android:id="@+id/Button02"  
  12.             android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1.0" android:enabled="false"></Button>  
  13.         <Button android:text="reset" android:id="@+id/Button03"  
  14.             android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1.0"></Button>  
  15.     </LinearLayout>  
  16. </LinearLayout>  


TestTimer.java 
-------------- 
Java代码   收藏代码
  1. package cn.yo2.aquarium.android.testtimer;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10.   
  11. public class TestTimer extends Activity {  
  12.     private Button btnStart;  
  13.     private Button btnStop;  
  14.     private Button btnReset;  
  15.     private TextView tvCounter;  
  16.     private long count = 0;  
  17.     private boolean run = false;  
  18.   
  19.     private Handler handler = new Handler();  
  20.   
  21.     private Runnable task = new Runnable() {  
  22.   
  23.         public void run() {  
  24.             // TODO Auto-generated method stub  
  25.             if (run) {  
  26.                 handler.postDelayed(this, 1000);  
  27.                 count++;  
  28.             }  
  29.             tvCounter.setText("Count: " + count);  
  30.         }  
  31.     };  
  32.   
  33.     /** Called when the activity is first created. */  
  34.     @Override  
  35.     public void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         setContentView(R.layout.main);  
  38.   
  39.         btnStart = (Button) findViewById(R.id.Button01);  
  40.         btnStop = (Button) findViewById(R.id.Button02);  
  41.         btnReset = (Button) findViewById(R.id.Button03);  
  42.         tvCounter = (TextView) findViewById(R.id.counter);  
  43.   
  44.         btnStart.setOnClickListener(new OnClickListener() {  
  45.   
  46.             public void onClick(View v) {  
  47.                 // TODO Auto-generated method stub  
  48.                 run = true;  
  49.                 updateButton();  
  50.                 handler.postDelayed(task, 1000);  
  51.             }  
  52.         });  
  53.   
  54.         btnStop.setOnClickListener(new OnClickListener() {  
  55.   
  56.             public void onClick(View v) {  
  57.                 // TODO Auto-generated method stub  
  58.                 run = false;  
  59.                 updateButton();  
  60.                 handler.post(task);  
  61.             }  
  62.         });  
  63.   
  64.         btnReset.setOnClickListener(new OnClickListener() {  
  65.   
  66.             public void onClick(View v) {  
  67.                 // TODO Auto-generated method stub  
  68.                 count = 0;  
  69.                 run = false;  
  70.                 updateButton();  
  71.                 handler.post(task);  
  72.             }  
  73.         });  
  74.     }  
  75.   
  76.     private void updateButton() {  
  77.         btnStart.setEnabled(!run);  
  78.         btnStop.setEnabled(run);  
  79.     }  
  80. }  
Android定时任务与短信验证实战:时间定时器与Handler使用指南 定时任务是系统自动执行预设任务的机制,它能够根据设定的时间或条件,自动触发并执行特定的操作。在移动应用开发中,定时任务用于在不需要用户交互的情况下,定时执行如数据同步、检查更新、执行清理操作等任务。这些任务的定期执行有助于优化应用性能、提升用户体验,以及保证应用数据的时效性。 阅读详情

相关推荐

Android Handler定时更新UI

Android Handler定时更新UI

Android使用handler实现简单的定时器,主线程每秒刷新UI

之前的项目在集成播放器的时候,想自定义播放器的进度条控制面板,当时就想做一个简单的定时器,来完成提取每秒的进度,一开始用TimerTask感觉有点蛋疼,因为要同步刷新界面,而TimerTask是新的线程,不能再里边写更新UI的操作,刚开始使用handler来发送到主线程来进行处理的,感觉代码一片乱糟糟的不舒服。后来就自己想办法精简一下,之后就想到handler的延迟操作方法,发现可以免去了TimerTask的使用,并且handler使用效果还算可以,这里写个小记录。

Mr.L bicker的博客 1万+

如何从RHEL 8升级到RHEL 9

Red Hat 于 2022 年 5 月 17 日宣布全面推出 RHEL 9。这是 RHEL(Red Hat Enterprise Linux)的最新版本,它具有许多功能和增强功能。

u012748257的博客 1019

使用Handler实现定时刷新数据,更新UI

本文章只是自己作为学习记录之用,如有错误之处,请指正,谢谢! //定义一个解析json数据的代码 public void SendRequestWithOkhttp() { new Thread(new Runnable() { @Override public void run() { try { ...

Aichilubiantan的博客 5461

【网络原理】HTTP 请求 (Request)详解

【网络原理】HTTP 请求 (Request)详解,认识URLquery string关于 URL encode, GET方法,POST 方法,GET 和 POST 的区别,User-Agent (简称 UA),Referer,Cookie

ZXT的博客 1万+

Docker篇——Docker常用命令大全!史上最全面的Docker命令,涵盖常规命令、镜像基本命令、容器基本命令以及常用其他命令,一篇文章速通!

本篇文章介绍的关于DOcker的命令非常全面,Docker常见的命令介绍完毕,涉及到的命令比较繁杂,希望大家可以收藏并坚持学习。后续还会持续更新相关技术点,敬请期待

我热爱学习,也乐于分享。无论是科技前沿的洞见,还是生活中的小技巧,我都会在这里与你分享。我相信,知识就是力量,而分享则能让这份力量得到更好的传递。 5746

Android定时刷新UI界面----Handler

本想做一个软件可以对UI界面进行定时更新,找了一些资料,先贴一个简单的定时更新界面程序,可以实现每隔1秒递增计数器的功能。 界面布局文件main.xml &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

aaa1032773840的博客 832

WinCC7.5 SP2 安装与授权(文末附授权软件)

安装部分参考了wincc7.5官网下载及安装配置(适配window10超详细教程) 主要介绍授权部分(仅供学习,商用请下载正版授权): 通过官网下载安装了WinCC7.5(需要在西门子官网注册账户,10积分下载)。 安装成功以后,还没授权,先别立即打开。 下载Sim_EBK_Install 复制链接到百度网盘中离线下载: 都是一样的软件,版本不同。有部分解压时需要输入密码,可选择方框里的不需要解压密码: 解压以后,打开: 最后检查秘钥授权是否成功 打开桌面(这是安装WinCC以后就有的): 左

skr? 7万+

Android Handler定时更新UI

Handler在android里负责发送和处理消息。它的主要用途有:   1)按计划发送消息或执行某个Runnanble(使用POST方法);   2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)    默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper loop

Jumping的专栏 1674

Python从0到100完整学习指南(必看导航)

想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者!

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 6万+

使用R语言获取data.frame中指定列的数据

这里以"df"为例,包含三列数据:“列1”、“列2"和"列3”。通过以上代码,我们成功获取了"列1"和"列3"的数据,并将它们分别存储在了变量"column1"和"column3"中。假设我们有一个名为"df"的data.frame,其中包含了多个列,我们想要提取其中的某一列。符号,我们可以从data.frame中提取出"列2"的数据,并将其赋值给变量"column2"。符号,我们可以轻松提取出data.frame中特定列的数据,并将其存储在变量中供进一步的分析和处理使用。假设我们要获取"列2"的数据。

DevRevolt的博客 2321

android handler定时更新ui,android中利用Handler来更新UI

刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题new Thread( new Runnable() {public void run() {myView.invalidate();}}).start();然而发现这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。查阅了文档和apidemo后,发觉...

weixin_28909503的博客 431

YOLOv11改进 - 卷积Conv | PConv(Pinwheel-shaped Conv): 风车状卷积用于红外小目标检测 | AAAI 2025

本文介绍了风车状卷积(PConv)和基于尺度的动态(SD)损失在YOLOv11中的结合应用。PConv采用不对称填充,通过特殊结构设计、卷积运算和分组卷积技术,能更好地适应红外小目标的像素高斯空间分布,在少量增加参数的情况下极大扩展感受野。SD损失可根据目标大小动态调整尺度和位置损失的影响。我们将PConv集成到YOLOv11的主干网络低层,并在相关配置文件中进行设置。实验证明,YOLOv11 - PConv在IRSTD - 1K和SIRST - UAVB数据集上取得显著性能提升,验证了方法的有效性和泛化能

魔改工程师的博客 1334

利用Handler来实现UI线程的更新

第一种: Handler来根据接收的消息,处理UI更新。Thread线程发出Handler消息,通知更新UI。 Handler myHandler = new Handler() {             public void handleMessage(Message msg) {                   switch (msg.what) {

Ivory_wiki的博客 707

手撕Lua字节码:从黑盒到透明

lua 字节码 怎么‘手撕’一个 chunk 看看里面啥样?我手里有一个.luac或出来的二进制字节码,想知道里面到底是什么结构、哪些字段、有哪些指令,怎么一步一步“拆箱”,从一个黑盒变成有迹可循的东西?也就是:不满足于只会loadpcall而是想亲眼看看一个 chunk 内部长啥样,甚至写点工具把它解析出来。这篇就用带你从“拿到一坨.luac不搞高深玄学,尽量让你看完就能自己动手。注:以 Lua 5.3/5.4 为主,细节各版本略有不同,但大体套路是一致的。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 97

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

利用Handler 来更新Android 的UI

刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 Java代码    new Thread( new Runnable() {         public void run() {              myView.invalidate();         }            }).start();

huazaichang的专栏 301

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android studio定时器代码简析

本文结合源代码详细分析一下基于message的定时器,在编写物联网应用APP的时候,获取传感器数据会用到这个功能。

ieeee.blog.youkuaiyun.com 3131

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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...

android 定时器更新UI

很快就到了22:30.作为程序员,现在这个时间,好像是吃完饭刚开始吧。唠叨结束。 目的:使用定时器每秒更新一下 TextView ,来显示一下上面的内容。艰辛使用之路开始了。注意:在我的使用探索过程中我得知,定时器任务的run 方法是开启另一个子线程。但在子线程中又不能直接更新UI。Handler 就解决了这个问题。制作过程:1、声明所使用的类 import java.util.Timer; ...

炉子热 3523

Android Handler的使用

大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handler的用法之前是怎么样写的程序,代码如下所示: package com.android.tutor; import java.util.Timer; import java.u...

weixin_34247299的博客 96

采用Handler的postDelayed实现安卓定时器

MySQL分页 主要是MySQL数据库内置LIMIT函数 注意添加mysql的JAR包mysql-connector-java-5.1.13-bin.jar  select * from table LIMIT 5,10;  // 检索记录行 6-15 在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引。随着数据量的增加,页数会越来越多,查看后

u012515510的专栏 1033

android timer 更新 ui,Android Timer 定时器 更新UI

在使用Timer的时候经常遇到需要更新UI。因为Timer的执行事件是子线程,是无法直接操作UI的。这时候要使用到HandlerTimer 主要属性 scheduleAtFixedRate(要执行的方法,开启后多久执行,间隔时间多久执行) ;scheduleAtFixedRate(new MyTask(),0,1000);//我有一个MyTask类在0毫秒后执行,每间隔1秒执行一次zhxct=...

weixin_36378951的博客 336

android UI更新问题 Thread和Looper以及Handler和Message详解 Android开发必读

1. 为什么不能在四大组件的主线程中对UI界面增删改  答案:根本原因是Android的UI操作不是线程安全的,即只能在单线程中完成UI的更新,不能使用多线程。因此,只能在主线程中进行UI更新。 http://wenku.baidu.com/view/738f6d3343323968011c9279.html     方法一:(java习惯,在android不推荐使用) 刚刚开始接触a

sqk1988-IT心园 8632

安卓定时更新UI两种方法

安卓定时更新UI两种方法: (1)仅在应用程序生命周期内发生的定时操作,Handler类与Timer和Thread类的结合,效率比较高,代码简单 (2)AlarmManger定时,适合长期在后台运行的的定时任务,具有唤醒cpu的功能,需结合服务和广播。 代码实现: 第一种方法分三步走 先创建Timer对象 Timer timer = new Timer();再创建TimerTask的匿

baidu_38370610的博客 3442

使用Handler定时更新UI

原文地址::http://blog.youkuaiyun.com/wtao158/archive/2010/01/06/5145046.aspx 网上相关文章 Android 平台上,界面元素在定时器的响应函数里刷新   http://yansaibo.javaeye.com/blog/716990       在Android里定时更新 UI,通常使用的是 java.util.Timer,

xqhrs232的专栏 1041
上一篇: Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
下一篇: JAVA中int转String类型效率比较
whatsyourname
博客等级 码龄23年 13粉丝 326原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值