可用于解决上一则笔记所提到的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:

  1. class NetworkThread extends Thread{
  2. @Override
  3. public void run(){
  4. String s = "模拟从网络中获取的数据";
  5. Message msg = handler.obtainMessage();
  6. msg.obj = s;
  7. handler.sendMessage(msg);
  8. }
  9. }

  2)复写handleMessage()方法。因为这个方法是被主线程调用的,所可以更改UI。

  1. class MyHandler extends Handler{
  2. @Override
  3. public void handleMessage(Message msg){
  4. tring s = (String)msg.obj;
  5. textView.setText(s);
  6. }
  7. }

四、主线程向WorkerThread发送数据

  1)在WorkerThread中

  1. //在WorkerThread当中启动Looper,重写Handler的handleMessage()方法
  2. //如果是MainThread接收消息则不需要写Looper的方法,只需要写handleMessage()方法
  3. class WorkerThread extends Thread{
  4. @Override
  5. public void run(){
  6. //准备Looper对象
  7. Looper.prepare();
  8. //在WorkerThread当中生成Handler对象
  9. handler = new handler(){
  10. @Override
  11. public void handleMessage(Message msg){
  12.  
  13. }
  14. }
  15. //调用Looper的loop()方法之后,Looper对象将不断地从消息队列中取出消息对象,然后调用handler的handleMessage()方法,处理该消息对象
  16. //如果消息队列当中没有对象,则该线程阻塞
  17. Looper.loop();
  18. }
  19. }
  20. //启动WorkerThread线程
  21. WorkerThread wt = new WorkerThread();
  22. wt.start;

  2)在MainThread中

  1. //在MainThread中发送消息(利用Button)
  2. button.setOnClickListener(new OnClickListener(){
  3. @Override
  4. public void onClick(View view){
  5. Message msg = handler.obtainMessage();
  6. handler.sendMessage(msg);
  7. }
  8. })

Android学习笔记(十三) Handler的更多相关文章

  1. Android学习笔记(38):Handler消息传递处理机制

    先说为什么须要Handler: Android的主线程又叫UI线程,用于处理与UI相关的时间.Android仅仅同意在主线程中改动UI组件,当我们在其它线程中须要改动UI界面时.就须要发送消息到主线程 ...

  2. 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...

  3. 【转】 Pro Android学习笔记(九十):了解Handler(4):Worker线程

    目录(?)[-] worker线程小例子 小例子代码worker线程通过handler实现与主线程的通信 小例子代码继承Handler代码 小例子代码子线程的Runnable 文章转载只能用于非商业性 ...

  4. 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子

    目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...

  5. 【转】Pro Android学习笔记(十三):用户界面和控制(1):UI开发

    目录(?)[-] UI开发 方式一通过XML文件 方式二通过代码 方式三XML代码 UI开发 先理清一些UI概念: view.widget.control:这三个名词其实没有什么区别,都是一个UI元素 ...

  6. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  7. 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...

  8. 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner

    目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...

  9. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  10. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

随机推荐

  1. 使用word模板生成pdf文件

    使用word模板生成pdf文件 源码:UserWord

  2. PyTorch 60 分钟入门教程:PyTorch 深度学习官方入门中文教程

    什么是 PyTorch? PyTorch 是一个基于 Python 的科学计算包,主要定位两类人群: NumPy 的替代品,可以利用 GPU 的性能进行计算. 深度学习研究平台拥有足够的灵活性和速度 ...

  3. Linux 下的编辑/编译器

    linux 首先有两个重量级的文本编辑器:vim 和 emacs 此外有如下三种比较好的开放环境: 1.Anjuta Anjuta DevStudio 的官方地址:http://anjuta.sour ...

  4. how to create modals with Bootstrap

    In this tutorial you will learn how to create modals with Bootstrap. Creating Modals with Bootstrap ...

  5. css class嵌套

    css 代码: <style> .chose_bonus { font-size:9px;width:400px;border: 2px solid #dddddd;margin-top: ...

  6. Spring Cloud Sleuth 中id的使用

    Spring Cloud Sleuth采用的是Google的开源项目Dapper的专业术语. Span:基本工作单元,发送一个远程调度任务 就会产生一个Span,Span是一个64位ID唯一标识的,T ...

  7. Lightoj 1012 - Guilty Prince

    bfs遍历一遍就行了. /* *********************************************** Author :guanjun Created Time :2016/6/ ...

  8. html5--switch选择结构的优化

    html5--switch选择结构的优化 问题: 使用循环语句判断月份是31天还是30天 两点提示: 使用switch多条件判断语句 合理的省略break优化代码 <!DOCTYPE html& ...

  9. 1.ARC下是否有内存溢出等问题 2.@property参数 3.#import和@class的区别

    1.ARC下是否有内存溢出等问题? 答案:必须要担心啊,ARC也不是万能的.答案:必须要担心啊,ARC也不是万能的.这里主要是涉及到集合类的数据类型   比如数组,我们定义了一个可变数组muarr1, ...

  10. socket实现进程间通信(转载)

    转自:http://blog.csdn.net/ast_224/article/details/3962221 使用socket实现进程间通信:(UNIX domain中面向连接通信) 使用套接字除了 ...