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主 ...
随机推荐
- 安装wxWidgets遭遇的两大关卡
早就想体验wxWidgets.这学期的C++课,课时还算充裕.关键是弟子们的实践能跟得上,我希望能让他们也浅尝一把GUI开发. MFC能够选.但既然IDE都用CodeBlocks了.还是选wxWidg ...
- linux中使用lftp上传下载文件
lftp是linux中一款ftp服务器相比windows中的ftp显得要复杂不少了,下面我来总结一下lftp文件上传,文件下载,及文件查找等等相关命令吧. lftp连接的几种方法,最常用的是lftp ...
- 在sql中根据成绩显示学生排名
1.准备 create table newtable ( name ), yuwen ), shuxue ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; , ); , ...
- python学习笔记(7)--爬虫隐藏代理
说明: 1. 好像是这个网站的代理http://www.xicidaili.com/ 2. 第2,3行的模块不用导入,之前的忘删了.. 3. http://www.whatismyip.com.tw/ ...
- CGPathCreateMutable
ios 图形与动画学习笔记 构造路径(CGPathCreateMutable) 一系列点放在一起,构成了一个形状.一系列的形状放在一起,构成了一个路径. /* 路径属于我们正在绘制他们的上下文.路 ...
- Qt下QTableWidget的使用
1.QTableWidget的基本设置 ui->tableWidget->setColumnCount(11); ui->tableWidget->setRowCount(Nu ...
- am335x -- led 控制
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h&g ...
- Redis JAVA客户端 Jedis常用方法
Jedis 是 Redis 官方首选的 Java 客户端开发包 (redis的java版本的客户端实现) #MAVEN配置 <dependency> <groupId>redi ...
- 0810 smarty
1.Smarty简介(why,what) why:smarrty 将前端工程师和程序员的工作分开,让前端工程师完成前台页面的工作,程序员完成后台的业务逻辑.what模版引擎是用来将PHP代码和模版页组 ...
- vmware无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件
原因: 是虚拟机服务没有开启 解决方法:(以管理员的方式运行) 点击“开始→运行”,在运行框中输入 CMD 回车打开命令提示符,然后依次执行以下命令. net start vmcinet start ...