Android Handler 的使用
Android UI 操作是线程不安全的。我们只能在UI线程或者说主线程中修改UI。试想多个Thread操作同一个UI,可能引起不一致。UI 线程的主要工作是:UI界面更新显示,各个控件的交互等等。一些耗时(time-consuming)操作不能放在UI线程中,典型的如:查询数据库,网络请求等等。这些操作留给worker线程来做。如何将worker线程的工作结果显示在UI上呢,
Android 提供的解决方法:提供Handler,用于thread之间的通信。通过Handler发送Message或者Runnable到MessageQueen。这其中有许多概念。这些概念是理解Android Thread 的关键。
一、实现 worker Thread修改UI。
worker Thread 是相对主线程Main Thread(UI thread)来说的。
以简单的实例说明:点击按钮屏幕Toast提示,更新button 文字。
1.通过handler 向 MessageQueen中发送Message。在Handler 的回调函数 handlerMessage() 中完成UI的更新。
public class MainActivity extends Activity {
private Handler mHandler;
private Button mButton ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)findViewById(R.id.btn);
mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
updateUI();
};
};
mButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
TimeConsumeTask();
mHandler.sendEmptyMessage(0);
}
}).start();
}
});
}
// 更新UI操作
public void updateUI(){
Toast.makeText(getApplicationContext(), "更新UI", Toast.LENGTH_LONG).show();
mButton.setText("UI update");
}
// 模拟耗时操作
public void TimeConsumeTask(){
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
mHandler 为Activity 的成员变量,handleMessage函数中的更新UI操作是在UI线程中完成的。
显示:

2.通过handler 向 MessageQueen中Post Runnable 对象,Runnable对象中执行的是UI更新操作。
将上面上的代码稍作改动:
public class MainActivity extends Activity {
private Handler mHandler;
private Button mButton ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)findViewById(R.id.btn);
// mHandler = new Handler(){
// @Override
// public void handleMessage(Message msg){
// updateUI();
// };
// };
mHandler = new Handler();
mButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
TimeConsumeTask();
//mHandler.sendEmptyMessage(0);
mHandler.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
updateUI();
}
});
}
}).start();
}
});
}
public void updateUI(){
Toast.makeText(getApplicationContext(), "更新UI", Toast.LENGTH_LONG).show();
mButton.setText("UI update");
}
public void TimeConsumeTask(){
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果是一样的。
mHandler post Runnable对象到了UI thread 的MessageQueen中,UI thread的 Looper 负责处理MessageQueen中的message,Runnable中的更新UI代码最终是在UI thread中执行的。
Android Handler 的使用的更多相关文章
- Android Handler leak 分析及解决办法
In Android, Handler classes should be static or leaks might occur, Messages enqueued on the applicat ...
- Android Handler练习
package com.example.myact12; import java.util.Random; import android.support.v7.app.ActionBarActivit ...
- Android Handler简单使用
package com.example.myhandlertest3; import android.os.Bundle; import android.os.Handler; import andr ...
- Android Handler的使用
大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl ...
- [Android]Handler的消息机制
最经面试中,技术面试中有一个是Handler的消息机制,细细想想,我经常用到的Handler无非是在主线程(或者说Activity)新建一个Handler对象,另外一个Thread是异步加载数据,同时 ...
- 详解Android Handler的使用-别说你不懂handler
我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念 Handler主 ...
- Android handler Thread 修改UI Demo
/********************************************************************** * Android handler Thread 修改U ...
- Android Handler的简单使用
大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title. 首先我们看一下习惯了Java编程的人,在不知道Handl ...
- 详解Android Handler的使用
我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念 Handler主 ...
- 详解Android Handler的使用-别说你不懂handler(转)
我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念 Handler主 ...
随机推荐
- MYSQL数据库的导出的几种方法
mysql的数据导出几种方法 从网上找到一些问题是关于如何从MySQL中导出数据,以便用在本地或其它的数据库系统之上:以及 将现有数据导入MySQL数据库中. 数据导出 数据导出主要有以下几种方法 ...
- sql语句判断是否为数字、字母、中文
1. sql语句判断是否为数字.字母.中文 select ascii(字段) 数字:48-57字母:65-123汉字:123+ 如,要删除某个全为数字的字段 DELETE FROM table WH ...
- 基于jQuery的时间轴鼠标悬停动画插件
之前为大家分享了很多jquery插件,这次我们要来分享一款不太常见的jQuery插件,它是一个时间轴,时间轴上的每一个点在鼠标滑过时都可以显示该点的描述信息,并且鼠标滑过时都可以产生一定的动画特效,比 ...
- [misc]如何在嵌入式平台使用printf功能
转自:http://www.cnblogs.com/liu_xf/archive/2011/04/14/2015726.html 摘要: 当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上, ...
- RegisterStartupScript 后退重复提示解决方法
我在后台调用RegisterStartupScript注册脚本,提示用户是否要跳转到另外一个页面,可是问题就来了,跳转到另外一个页面后,一旦用户后退,原来的页面就会又提示脚本信息, 后来自己想了想,用 ...
- php7 安装扩展
安装mongodb扩展 前提:安装好php7,位置:/usr/local/php 方法一: /usr/local/php7/bin/pecl install mongodb service php-f ...
- 你所不知道的JSON
译者按: 老司机们,你知道JSON.stringify还有第二个和第三个可选参数吗?它们是什么呢? JSON已经逐渐替代XML被全世界的开发者广泛使用.本文深入讲解JavaScript中使用JSON. ...
- 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
早期,我们使用 Debian 作为服务器软件,后来转向了CentOS,主要原因如下: 1.CentOS/RHEL的生命周期是7年,基本上可以覆盖硬件的生命周期,也就意味着一个新硬件安装以后,不用再次安 ...
- Streams:深入剖析Redis5.0全新数据结构
Streams:深入剖析Redis5.0全新数据结构 原创: 阿飞的博客 Redis 5.0 全新的数据类型:streams,官方把它定义为:以更抽象的方式建模日志的数据结构.Redis的st ...
- CSS3实现0.5px的边框
前端页面细节处理好了才会显得精致.边框在网页中是常见的一种样式了.虽然不把它处理为0.5px看上去没毛病,但是想让你做的东西征服更多的人,这些细节处理是必须的. 今天主要说一下如何让边框显示0.5px ...