Android学习笔记(十三) Handler
可用于解决上一则笔记所提到的WorkerThread无法修改UI控件的问题
一、Handler、Looper和MessageQueue的基本原理

Handler把消息对象放到MessageQueue当中,而Looper负责在消息队列头部不断取出消息对象。取出的对象再交给Handler处理。
二、一个简单的Handler例子
-先创建一个继承Handler的类,注意是导入Android.os.Handler(非常重要)
class firstHandler extends Handler{}
-复写方法handleMessage(Message msg)
-创建Handler对象
handler = firstHandler()
-生成一个Message,并且给what成员变量赋值
Message msg = handler.obtainMessage();
msg.what = 2;
-将消息对象放置到消息队列中。
handler.sendMessage(msg);
-Looper将会从消息队列当中将消息对象取出;
-Looper将会找到与消息对象对应的Handler对接(每一个Message对象都有与之对应的Handler对象);
-Looper将会调用Handler对象的handleMessage(Message msg)方法,用于处理消息对象。
三、在主线程当中实现Handler的handleMessage()方法
注:不管是在WorkerThread还是在MainThread中都可以发送消息,即:handler.sendMessage(Message msg)
1)在新建线程的run()中发送Message:
class NetworkThread extends Thread{
@Override
public void run(){
String s = "模拟从网络中获取的数据";
Message msg = handler.obtainMessage();
msg.obj = s;
handler.sendMessage(msg);
}
}
2)复写handleMessage()方法。因为这个方法是被主线程调用的,所可以更改UI。
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg){
tring s = (String)msg.obj;
textView.setText(s);
}
}
四、主线程向WorkerThread发送数据
1)在WorkerThread中
//在WorkerThread当中启动Looper,重写Handler的handleMessage()方法
//如果是MainThread接收消息则不需要写Looper的方法,只需要写handleMessage()方法
class WorkerThread extends Thread{
@Override
public void run(){
//准备Looper对象
Looper.prepare();
//在WorkerThread当中生成Handler对象
handler = new handler(){
@Override
public void handleMessage(Message msg){ }
}
//调用Looper的loop()方法之后,Looper对象将不断地从消息队列中取出消息对象,然后调用handler的handleMessage()方法,处理该消息对象
//如果消息队列当中没有对象,则该线程阻塞
Looper.loop();
}
}
//启动WorkerThread线程
WorkerThread wt = new WorkerThread();
wt.start;
2)在MainThread中
//在MainThread中发送消息(利用Button)
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view){
Message msg = handler.obtainMessage();
handler.sendMessage(msg);
}
})
Android学习笔记(十三) Handler的更多相关文章
- Android学习笔记(38):Handler消息传递处理机制
先说为什么须要Handler: Android的主线程又叫UI线程,用于处理与UI相关的时间.Android仅仅同意在主线程中改动UI组件,当我们在其它线程中须要改动UI界面时.就须要发送消息到主线程 ...
- 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...
- 【转】 Pro Android学习笔记(九十):了解Handler(4):Worker线程
目录(?)[-] worker线程小例子 小例子代码worker线程通过handler实现与主线程的通信 小例子代码继承Handler代码 小例子代码子线程的Runnable 文章转载只能用于非商业性 ...
- 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子
目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...
- 【转】Pro Android学习笔记(十三):用户界面和控制(1):UI开发
目录(?)[-] UI开发 方式一通过XML文件 方式二通过代码 方式三XML代码 UI开发 先理清一些UI概念: view.widget.control:这三个名词其实没有什么区别,都是一个UI元素 ...
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...
- 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...
- 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner
目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
- Android学习笔记进阶之在图片上涂鸦(能清屏)
Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...
随机推荐
- DLR之 ExpandoObject和DynamicObject的使用演示样例
ExpandoObject :动态的增删一个对象的属性,在低层库(比如ORM)中非常实用.因为ExpandoObject实现了IDictionay<string, object>接口,常见 ...
- socket.io实现在线群聊
我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单的聊天程序.最最开始 先安装socket.io: npm install socket.io 利用Node的搭 ...
- bzoj1465 bzoj1045: [HAOI2008] 糖果传递&&bzoj3293: [Cqoi2011]分金币
一道神奇的题..看到做法是排序我的心是绝望的.. 首先我们可以先求出每个小朋友应该得到的糖果数,就是平均值,然后ave-a[i]就代表要从其他小朋友那得到多少个糖果(如果是负数就是要送出糖果)然后求前 ...
- HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...
- ubuntu php5.6源码安装
本系列的lnmp的大框架基本上是按照http://www.linuxzen.com/lnmphuan-jing-da-jian-wan-quan-shou-ce-si-lnmpda-jian-yuan ...
- javascript 省、市、地县三级联动
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD&g ...
- 【Usaco2008 Dec】Patting Heads
[题目链接] 点击打开链接 [算法] 我们知道,每个编号为a[i]都要被编号是a[i]的约数的牛拍一次头(除了它自己),因此,只需用类似于筛法的方式统计答案, 即可 [代码] #include< ...
- AutoIT: 学习对GUI Sample上所有的资源进行操作
$handle= WinGetHandle("Sample GUI") ;,"SRE Example 3 Result", $handle) $ctrl= Co ...
- yum和apt-get 安装方式
rpm包和deb包是两种Linux系统下最常见的安装包格式,在安装一些软件或服务的时候免不了要和它们打交道.rpm包主要应用在RedHat系列包括 Fedora等发行版的Linux系统上,deb包主要 ...
- css 实现元素四角图片样式,元素的大小不定
demo 效果 css body { margin:; } .popup p{ margin-bottom:20px; margin-left:200px; } .popup p span{ disp ...