可用于解决上一则笔记所提到的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的更多相关文章

  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. NYOJ110 剑客决斗

    剑客决斗 来源:Polish Olympiad in Informatics(波兰信息学奥林匹克竞赛) 时间限制:5000 ms  |  内存限制:65535 KB 难度:5   描述 在路易十三和红 ...

  2. struts2的(S2-045,CVE-2017-5638)漏洞测试笔记

    网站用的是struts2 的2.5.0版本 测试时参考的网站是http://www.myhack58.com/Article/html/3/62/2017/84026.htm 主要步骤就是用Burp ...

  3. LIKIE INSTR

    SELECT  url FROM test_url WHERE   FROM_UNIXTIME(create_time,'%Y%m%d %H') < '20171218 00'  AND  no ...

  4. 关于bitset

    https://www.zybuluo.com/ysner/note/1327705 原理 \(bitset\)的原理是将一大堆值为\(0/1\)的数压成一个数. 操作 通过\(i>>x\ ...

  5. r.json()

    requests模块中,r.json()为Requests中内置的JSON解码器 其中只有response返回为json格式时,用r.json()打印出响应的内容, 如果response返回不为jso ...

  6. Python解压缩ZIP格式

    转自:http://blog.csdn.net/linux__kernel/article/details/8271326 很多人在Google上不停的找合适自己的压缩,殊不知Py的压缩很不错.可以试 ...

  7. jquery 3D云

    http://www.jq22.com/jquery-info1325 http://demo.jq22.com/jquery-cloud-141217202931 下载地址: http://www. ...

  8. 本地通信实例(AF_UNIX) (转载)

    转自:http://www.groad.net/bbs/thread-1709-1-1.html 程序说明:  程序里包含服务端和客户端两个程序,它们之间使用 AF_UNIX 实现本机数据流通信.使用 ...

  9. Chrome应用商店打不开解决方法

    方法一.谷歌访问助手(推荐) 谷歌访问助手是一款免费的谷歌代理插件,不用配置即可打开Chrome应用商店,而且速度很不错. 1.根据自己使用的浏览器点击对应版本的插件.详细安装都在下面链接中. 下载地 ...

  10. Linux 常用命令八 find

    一.find命令 find命令用于查找文件. 按文件名字查找: wang@wang:~/workpalce/python$ sudo find / -name "create.txt&quo ...