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 ...
随机推荐
- 使用word模板生成pdf文件
使用word模板生成pdf文件 源码:UserWord
- PyTorch 60 分钟入门教程:PyTorch 深度学习官方入门中文教程
什么是 PyTorch? PyTorch 是一个基于 Python 的科学计算包,主要定位两类人群: NumPy 的替代品,可以利用 GPU 的性能进行计算. 深度学习研究平台拥有足够的灵活性和速度 ...
- Linux 下的编辑/编译器
linux 首先有两个重量级的文本编辑器:vim 和 emacs 此外有如下三种比较好的开放环境: 1.Anjuta Anjuta DevStudio 的官方地址:http://anjuta.sour ...
- how to create modals with Bootstrap
In this tutorial you will learn how to create modals with Bootstrap. Creating Modals with Bootstrap ...
- css class嵌套
css 代码: <style> .chose_bonus { font-size:9px;width:400px;border: 2px solid #dddddd;margin-top: ...
- Spring Cloud Sleuth 中id的使用
Spring Cloud Sleuth采用的是Google的开源项目Dapper的专业术语. Span:基本工作单元,发送一个远程调度任务 就会产生一个Span,Span是一个64位ID唯一标识的,T ...
- Lightoj 1012 - Guilty Prince
bfs遍历一遍就行了. /* *********************************************** Author :guanjun Created Time :2016/6/ ...
- html5--switch选择结构的优化
html5--switch选择结构的优化 问题: 使用循环语句判断月份是31天还是30天 两点提示: 使用switch多条件判断语句 合理的省略break优化代码 <!DOCTYPE html& ...
- 1.ARC下是否有内存溢出等问题 2.@property参数 3.#import和@class的区别
1.ARC下是否有内存溢出等问题? 答案:必须要担心啊,ARC也不是万能的.答案:必须要担心啊,ARC也不是万能的.这里主要是涉及到集合类的数据类型 比如数组,我们定义了一个可变数组muarr1, ...
- socket实现进程间通信(转载)
转自:http://blog.csdn.net/ast_224/article/details/3962221 使用socket实现进程间通信:(UNIX domain中面向连接通信) 使用套接字除了 ...