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主 ...
随机推荐
- Docker 监控的一点想法
目前项目内部署了docker,于是涉及到关于监控的事情,参考一些经典实例以及一些自己的想法,总结一下思路. 1.关于监控的内容 监控宿主机本身 监控宿主机本身还是比较简单的,同其他服务器监控类似,对c ...
- PHP.ini中配置屏蔽错误信息显示和保存错误日志
在PHP程序运行过程中如果有错误发生,在浏览器上是否显示错误信息,以及显示错误信息的级别是我们在程序开发.调试.运营过程中需要控制的. root@(none):/alidata/www/default ...
- 03、同事分享课程的笔记 —《Android应用低功耗设计》
这是安卓组的同事一个月前分享的一节课程,听课时写了一下笔记,之前是写在本子上的,感觉内容挺不错 的,就保存在博客了吧,方便回看. 他曾经在就职于英特尔公司,是与芯片设计相关的,这课程标题虽然是与安卓相 ...
- zepto与jquery冲突
公司项目中一直用的都是zepto,但是jQuery扩展的插件比较多. jQuery有一个方法noConflict(),可以把jQuery的$改掉.var aa = $.noConflict();就用a ...
- iOS中的动画(转载)
iOS中的动画 最近两天没事在慢慢学习一些动画,好多东西长时间不用都给忘了,找到一篇介绍很详细的文章就粘贴了过来以备复习,原文地址:https://my.oschina.net/aofe/blog/ ...
- AndroidStudio添加Android源码
找了半天没找到,还是用google好啊!修改如下,打开如下的build.gradle,修改compileSdkVersion 为你下载的源码版本号. Open your sdk manager fro ...
- Office Web App2013 在线查看PDF文件
经常会有客户问,在SharePoint中,如何在浏览器中查看与编辑文档,通常给出的解决方案是集成Office Web App. 而在实际应用过程中,客户通常会要求实现PDF文件在线查看,对于PDF文件 ...
- 本机添加多个git仓库账号
我们可能会需要在一台电脑上以不同的github账户去使用git,这时就需要去解决如何管理本机上的多个ssh key的问题了. 生成新ssh key 如果我们电脑上已经存在了一个ssh key,那么我们 ...
- PHP高并发的解决方案
这几天面试,被问到这样一个问题:如何解决大流量的高并发问题.起初不知所措,在查阅相关资料,以及网上大牛们的解答之后,总结出以下几点: 1.服务器,如果同时访问量超过10W的话,需要采用专用服务器来承载 ...
- MyBatis-Spring-Boot 使用总结
接 MyBatis-Spring 使用总结 . mybatis开发团队为Spring Boot 提供了 MyBatis-Spring-Boot-Starter . 首先,MyBatis-Sprin ...