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 ...
随机推荐
- NYOJ110 剑客决斗
剑客决斗 来源:Polish Olympiad in Informatics(波兰信息学奥林匹克竞赛) 时间限制:5000 ms | 内存限制:65535 KB 难度:5 描述 在路易十三和红 ...
- struts2的(S2-045,CVE-2017-5638)漏洞测试笔记
网站用的是struts2 的2.5.0版本 测试时参考的网站是http://www.myhack58.com/Article/html/3/62/2017/84026.htm 主要步骤就是用Burp ...
- LIKIE INSTR
SELECT url FROM test_url WHERE FROM_UNIXTIME(create_time,'%Y%m%d %H') < '20171218 00' AND no ...
- 关于bitset
https://www.zybuluo.com/ysner/note/1327705 原理 \(bitset\)的原理是将一大堆值为\(0/1\)的数压成一个数. 操作 通过\(i>>x\ ...
- r.json()
requests模块中,r.json()为Requests中内置的JSON解码器 其中只有response返回为json格式时,用r.json()打印出响应的内容, 如果response返回不为jso ...
- Python解压缩ZIP格式
转自:http://blog.csdn.net/linux__kernel/article/details/8271326 很多人在Google上不停的找合适自己的压缩,殊不知Py的压缩很不错.可以试 ...
- jquery 3D云
http://www.jq22.com/jquery-info1325 http://demo.jq22.com/jquery-cloud-141217202931 下载地址: http://www. ...
- 本地通信实例(AF_UNIX) (转载)
转自:http://www.groad.net/bbs/thread-1709-1-1.html 程序说明: 程序里包含服务端和客户端两个程序,它们之间使用 AF_UNIX 实现本机数据流通信.使用 ...
- Chrome应用商店打不开解决方法
方法一.谷歌访问助手(推荐) 谷歌访问助手是一款免费的谷歌代理插件,不用配置即可打开Chrome应用商店,而且速度很不错. 1.根据自己使用的浏览器点击对应版本的插件.详细安装都在下面链接中. 下载地 ...
- Linux 常用命令八 find
一.find命令 find命令用于查找文件. 按文件名字查找: wang@wang:~/workpalce/python$ sudo find / -name "create.txt&quo ...