012android初级篇之Handler机制
设计Handler类的目的
Handler类被用来注册到一个线程中,这样可以提供一个简单的通信渠道,用来发送数据到这个线程。
可作为UI线程与后台线程交互的几种方法之一。
具体用途
- 消息的分发和处理,安排 messages 和 runnables在未来某个时刻被执行;
- 队列action在其他线程上被执行;
与之相关的类:looper类,
looper 主要功能是为特定单一线程运行一个消息环。
一个线程对应一个looper。同样一个looper对应一个线程。这就是所谓的特定单一;
一般情况下,在一个线程创建时他本身是不会产生他特定单一的looper的(主线程是个例外)。因此我们需要手动的把一个looper与线程相关联。其方法只需在需要关联的looper的线程中调用Looper.prepare。之后我们再调用Looper.loop启动looper。
如下例子:class NetWorkThread implements Runnable
{
public MyHandler mHandler =new MyHandler();
@Override
public void run() { Looper.prepare();
//mHandler =new MyHandler();
Looper.loop();
}
}
具体的说,在我们将特定单一looper与线程关联的时候,looper会同时生产一个messageQueue。他是一个消息队列,looper会不停的从messageQuee中取出消息,也就是message。然后线程就会根据message中的内容进行相应的操作。
looper和handler并非一一对应的。一个looper可以对应多个handler,而一个handler只能对应一个looper。handler和looper的绑定,是在构建handler的时候实现的,具体查询handler的构造函数。
message,虽然我们可以自己创建一个新的message,但是更加推荐的是调用handler的obtainMessage方法来获取一个message。这个方法的作用是从系统的消息池中取出一个message,这样就可以避免message创建和销毁带来的资源浪费了。
假设A线程要传递信息给B线程,我们需要做的就是
- 在B线程中调用Looper.prepare和Looper.loop。(主线程不需要)
- 编写Handler类,重写其中的handleMessage方法。
- 创建Handler类的实例,并绑定looper
- 调用handler的sentMessage方法发送消息。
实例代码
NetWorkThread mNetWorkThread =new NetWorkThread();
new Thread(mNetWorkThread).start();
Message msg = mNetWorkThread.mHandler.obtainMessage();
msg.arg1=12;
mNetWorkThread.mHandler.sendMessage(msg);
Message相关
Message的使用样例
Message message = Message.obtain();
message.arg1 = 1;
message.arg2 = 2;
message.obj = "Demo";
message.what = 3;
Bundle bundleData = new Bundle();
bundleData.putString("Name", "Lucy");
message.setData(bundleData);
Message可以传递的参数有
- public int arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型
- public Object object 类型
- public int what 用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。
- 其他的可以通过Bundle进行传递
Message的构造函数
Message可以通过new Message构造来创建一个新的Message,但是这种方式很不好,不建议使用。最好使用Message.obtain()来获取Message实例,它从消息池获取。
参考链接
- Android开发中Handler的经典总结
- Android background processing with Handlers, AsyncTask and Loaders - Tutorial
- Android中UI线程与后台线程交互设计的5种方法
- Java中Runnable和Thread的区别
- Android:主线程如何向子线程发送消息
- android parcelable 详解
012android初级篇之Handler机制的更多相关文章
- 25个增强iOS应用程序性能的提示和技巧(初级篇)
25个增强iOS应用程序性能的提示和技巧(初级篇) 标签: ios内存管理性能优化 2013-12-13 10:53 916人阅读 评论(0) 收藏 举报 分类: IPhone开发高级系列(34) ...
- ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇(转)
ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇 阅读目录 ASP.NET Identity 前世今生 建立 ASP.NET Identity 使用ASP.NET ...
- Handler机制原理图、源码、使用!!!!!
android的消息处理机制——Looper,Handler,Message (原理图.源码) 转自:http://my.oschina.net/u/1391648/blog/282892 在开始讨 ...
- Redis从入门到精通:初级篇
原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...
- Redis从入门到精通:初级篇(转)
原文链接:http://www.cnblogs.com/xrq730/p/8890896.html,转载请注明出处,谢谢 Redis从入门到精通:初级篇 平时陆陆续续看了不少Redis的文章了,工作中 ...
- PHP初级篇
PHP初级篇 PHP环境搭建: 企业中常用到的环境是:Linux+Apache+MySQL+PHP 学习环境是:Windows+Apache+MySQL+PHP 工具 Apache 2.4.4 MyS ...
- 源码篇:Handler那些事
前言 Handler属于八股文中非常经典的一个考题了,导致这个知识点很多时候,考官都懒得问了:这玩意很久之前就看过,但是过了一段时间,就很容易忘记,但是处理内存泄漏,aidlHandler之类的考点答 ...
- .NET C#教程初级篇 1-1 基本数据类型及其存储方式
.NET C# 教程初级篇 1-1 基本数据类型及其存储方式 全文目录 (博客园).NET Core Guide (Github).NET Core Guide 本节内容是对于C#基础类型的存储方式以 ...
- Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
随机推荐
- Xcode编译错误和警告汇总
1.error: macro names must be identifiers YourProject_prefix.pch 原因: 因为你弄脏了预处理器宏,在它处于<Multiple Val ...
- 关于 easyui datagridfilter 中的combox 过滤
var_activitimodel_datagrid.datagrid({ singleSelect: true, fit: true, striped: true, fitColumns: fals ...
- python3+django使用celery执行某些任务失败的解决方案
.在celery 的worker启动窗口设置export PYTHONOPTIMIZE=1 export PYTHONOPTIMIZE=1 /usr/local/python36/bin/celery ...
- projecteuler---->problem=11----Largest product in a grid
In the 2020 grid below, four numbers along a diagonal line have been marked in red. 08 02 22 97 38 1 ...
- [原创]用逻辑嗅探破解接触式IC卡口令
最近两周对接触型IC卡很感兴趣,就动手实践了一下,最终实现的效果是通过破解IC卡口令实现对数据修改,然后就可以随意洗衣服喽~IC卡从数据传递方式上划分为接触型和非接触型两种.接触型的卡片表面有金属贴片 ...
- Flask+uwsgi+Nginx环境搭建
开源软件准备需要的软件列表:setuptools-33.1.1.zipPython-2.7.13.tgzpip-9.0.1.tar.gznginx-1.10.3.tar.gz软件统一上传到/usr/l ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何动态显示当前运行行
在F11运行状态下,点击Online-Display Flow Control然后可以看到绿色的行就是当前正在运行行 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http:// ...
- sipp中的action使用方法
最近在做sip服务器的压力测试 场景:当主叫收到200 Ok之后要将Contact 头域中的字段放在ACK消息中的请求行和to头域中发给被叫 查看sipp官网文档就使用action, 在主叫脚本中增加 ...
- Android调试方法总结
Android程序调试过程中,通常需要在控制台或者AVD中弹出相关信息作为调试使用,以下是调试使用中会用到的Log类和Toast类的使用方法: 1.Toast Toast是在AVD上显示信息的一种机制 ...
- sencha touch结合webservice读取jsonp数据详解
sencha touch读取jsonp数据主要依靠Ext.data.JsonP组件,在mvc的store文件中定义代码如下: Ext.define('eparkapp.store.ParksNearb ...