Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >android Handler更新UI

android Handler更新UI

作者头像
水击三千
发布于 2018-02-27 09:22:01
发布于 2018-02-27 09:22:01
1.6K00
代码可运行
举报
文章被收录于专栏:水击三千水击三千
运行总次数:0
代码可运行

android中经常需要更新界面某个元素的值,但是在主线程中是不可以直接更新主线程的值。这里推荐通过handler机制来更新值。

一Handler的定义:

主要接受子线程发送的数据, 并用此数据配合主线程更新UI.           解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1     ProgressBar progressBar;
 2     ProgressBar progressBar2;
 3 
 4     private Handler handler1;
 5     private Handler handler=new Handler(){
 6         public void handleMessage(Message msg)
 7         {
 8             switch(msg.what)
 9             {
10             case 1:
11                 int currentProgress=progressBar.getProgress()+2;
12                 if(currentProgress>progressBar.getMax())
13                 {
14                 currentProgress=0;
15                 }
16                 progressBar.setProgress(currentProgress);
17                 break;
18             }
19         }
20     };
21     private int count;
22     private Runnable doundateProgress1 = new Runnable() {
23         
24         @Override
25         public void run() {
26             // TODO Auto-generated method stub
27         
28             }
29     
30         
31         };
32     private TimerTask timertask=new TimerTask() {
33         
34         @Override
35         public void run() {
36             // TODO Auto-generated method stub
37             Message message=new Message();
38             message.what=1;
39             handler.sendMessage(message);
40         }
41     };
42     
43     @Override
44     protected void onCreate(Bundle savedInstanceState) {
45         super.onCreate(savedInstanceState);
46         setContentView(R.layout.activity_main);
47         progressBar=(ProgressBar) findViewById(R.id.progressBar1);
48         progressBar2=(ProgressBar) findViewById(R.id.progressBar2);
49         Timer timer=new Timer();
50         timer.schedule(timertask, 0,1000);
51         handler1=new Handler();
52         handler1.postDelayed(new Runnable() {
53             
54             @Override
55             public void run() {
56                 // TODO Auto-generated method stub
57                 for (count = 0; count <= progressBar2.getMax();count++) {
58                     
59                     // TODO Auto-generated method stub
60                     progressBar2.setProgress(count);
61     
62         
63         
64             }
65             }
66         }, 10000);
67     }
68 
69     @Override
70     public boolean onCreateOptionsMenu(Menu menu) {
71         // Inflate the menu; this adds items to the action bar if it is present.
72         getMenuInflater().inflate(R.menu.main, menu);
73         return true;
74     }
75 
76     @Override
77     public boolean onOptionsItemSelected(MenuItem item) {
78         // Handle action bar item clicks here. The action bar will
79         // automatically handle clicks on the Home/Up button, so long
80         // as you specify a parent activity in AndroidManifest.xml.
81         int id = item.getItemId();
82         if (id == R.id.action_settings) {
83             return true;
84         }
85         return super.onOptionsItemSelected(item);
86     }

本例中分别通过timer和handler来更新ProgressBar的值。timer是java提供的定时器,它设置循环执行的间隔,可以设定重复执行和不重复执行。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-11-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发之《Android应用开发揭秘》UI事件汇总
思想跑毛是很可怕的,最近去尝试了下创业,结果碰了一鼻子灰,公司乱七八糟的项目搞的焦头烂额。各种没有心情。还好,现在沉淀下来,继续android开发的征程。
全栈程序员站长
2022/08/11
1.4K0
android 开发Handler源码剖析
Android的消息机制主要是Handler的运行机制,而讲Handler的机制,又需要和MessageQueue和Looper结合。MessageQueue中文意思是消息队列,虽说叫队列,但是其内部结构并不是队列组成的,而是采用了单链表的形式来存储消息。MessageQueue只是负责存储消息,并不处理消息(这里指消息的轮训),Looper刚好弥补了这个空缺。我在知道,Handler创建的时候,会默认为我们创建一个Looper对象,那么如何获取当前的Looper呢,这里就使用到了一个TheadLocal的
xiangzhihong
2018/02/02
5900
android 开发Handler源码剖析
android开发面试题
                                        2),子线程中借助主线程的handler传递一条message
fanfan
2022/05/07
3740
Android之十七 进度条和Hanlder
android:layout_width="match_parent"
张哥编程
2024/12/17
1120
android多线程下载1
想做一个下载功能,当然理想的功能要支持多任务同时下载,断点续传的功能,我想一步一步来,首先困难摆在了多任务这里 开始我的思路是在一个Service中启动下载的流操作,然后通过Service中声明一个Activity中的Handler更新UI(比如进度条。。。) 可是我发现在Service中声明一个Activity中的Handler是做不到的(可能只是我做不到吧,无法申请内存) 于是,我决定在Activity中直接启动线程,让其运行,调用自身的Handler来更新UI,没想到在这个下载Activity
xiangzhihong
2018/01/26
6490
Android中延时任务与定时任务
AndroidL开始repeat的周期必须大于60秒 所以短周期循环执行不建议使用
码客说
2019/10/22
3.4K1
Android 多媒体开发学习之简单的音乐播放器
我们今天的目的是学习如何创建一个简单的音乐播放器,可支持播放,暂停,继续播放,以及进度显示,已经进度拖拽。
DragonKingZhu
2022/05/08
8000
Android 多媒体开发学习之简单的音乐播放器
AsyncTask和Handler对比
1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l  简单,快捷 l  过程可控 使用的缺点: l  在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理和适用的优缺点 在Handler 异步实现时,涉及到 Handler, Looper,
欢醉
2018/01/22
1.3K0
安卓开发_深入理解Handler消息传递机制
一、概述 因为子线程的run()方法无法修改UI线程(主线程)的UI界面,所以Android引入了Handler消息传递机制,实现在新创建的线程中操作UI界面 二、消息类(Message) 消息类是存放在MessageQueue中的,而一个MessageQueue中可以包含多个Message对象 每一个Message对象可以通过Message.obtain()或者Handler.obtainMessage()方法获得 一个Message具有的属性: 属性 类型 介绍 arg1 int 存放整型数据 arg2
听着music睡
2018/05/18
9630
Android线程与消息处理
前面介绍了现成的用法,不过不能在新建的子线程中对UI进行修改。如果要操作,会报错Only the original thread that created a view hierarchy can touch its views。为此,Android引入Handler消息传递机制,来实现在线程中操作UI界面。
提莫队长
2019/03/01
8140
线程的加入
void join(long millis)           等待该线程终止的时间最长为 millis 毫秒。 void join()           等待该线程终止。 下面的
用户2965768
2019/03/20
7360
线程的加入
Android子线程更新UI主线程方法之Handler
我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的。 下面说下有关Handler相关的知识。 多线程一些基础知识回顾: 在介绍Handler类相关知识之前,我们先看看在Java中是如何创建多线程的 方法有两种: 通过继承Thread类,重写Run方法来实现 通过继承接口Runnable实现多线程 具体两者的区别与实现,看看 这篇文章 中的介绍; 接下来让我们看看Hand
晚晴幽草轩轩主
2018/03/27
2.4K0
android定时器开发[通俗易懂]
在android中,经常用到的定时器主要有以下几种实现: 一、采用Handler与线程的sleep(long )方法 二、采用Handler的postDelayed(Runnable, long) 方法 三、采用Handler与timer及TimerTask结合的方法。 下面逐一介绍: 一、采用Handle与线程的sleep(long )方法 Handler主要用来处理接受到的消息。这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释。 1.定义一个Handler类,用于处理接受到的Message. Handler handler = new Handler() { public void handleMessage(Message msg) { //要做的事情 super.handleMessage(msg); } }; 2.新建一个实现Runnable接口的线程类。如下: public class MyThread implements Runnable{ @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(10000);//线程暂停10秒,单位毫秒 Message message=new Message(); message.what=1; handler.sendMessage(message);//发送消息 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 3.在需要启动线程的地方加入下面语句: new Thread(new MyThread()).start(); 4.启动线程后,线程每10s发送一次消息。 二、采用Handler的postDelayed(Runnable, long) 方法 这个实现比较简单一些: 1. Handler handler=new Handler(); Runnable runnable=new Runnable(){ @Override public void run() { // TODO Auto-generated method stub //要做的事情 handler.postDelayed(this, 2000); } }; 2.启动计时器: handler.postDelayed(runnable, 2000);//每两秒执行一次runnable. 3.停止计时器: handler.removeCallbacks(runnable); 三、采用Handler与timer及TimerTask结合的方法。 1.定义定时器、定时器任务及Handler句柄 private final Timer timer = new Timer(); private TimerTask task; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub //要做的事情 super.handleMessage(msg); }
全栈程序员站长
2022/09/15
5730
6.网络编程
tomcat 获取Tomcat安装程序包 tar.gz文件是Linux操作系统下的安装版本 exe文件是Windows系统下的安装版本x86 x64 zip文件是Windows系统下的压缩版本 (建议) Tomcat启动方式 使用Tomcat服务程序(安装版)         使用Tomcat程序组中的快捷菜单(安装版)         使用Tomcat.exe程序(安装版)         使用批处理程序(使用解压版) 双击 bin 目录下的 startup.bat 文件 输入 http://local
六月的雨
2018/05/14
1.1K0
笔记38 | Android线程之解析Looper()和HandlerThread()
合抱之木,生於毫末;九層之台,起於累土;千里之行,始於足下。《老子》 地址 http://www.jianshu.com/p/dc2a4fb0fcde ---- 目录 Looper概念 Looper实例 HandlerThread概念 HandlerThread实例 ---- Looper概念 Android中的Looper类,是用来封装消息循环和消息队列的一个类,用于在android线程中进行消息处理。handler其实可以看做是一个工具类,用来向消息队列中插入消息的。 (1) Looper类用来为一个线
项勇
2018/06/19
4310
Android 事件处理探险
Android提供了两套事件处理机制:基于监听的事件处理;基于回调的事件处理 1.基于监听的事件处理 Android的事件处理是一种委派式事件处理方式(事件源将整个事件处理委托给事件监听器),事件监听的处理模型主要涉及:Event Source(事件源)、Event(事件)、Event Listener(事件监听器)。 小技巧: requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉窗口标题 getWindow().setFlags(WindowManage
非著名程序员
2018/02/02
7030
android中handler用法总结
一、Handler的定义:  Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用。比如可以用handler发送一个message,然后在handler的线程中来接收、处理该消息,以避免直接在UI主线程中处理事务导致影响UI主线程的其他处理工作,Android提供了Handler作为主线程和子线程的纽带;也可以将handler对象传给其他进程,以便在其他进程中通过handler给你发送事件;还可以通过handler的延时发送message,可以延时处理一些事务
10JQKA
2018/05/09
1.2K0
相关推荐
Android开发之《Android应用开发揭秘》UI事件汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验