Android线程消息通信(一)
Android在Java标准线程模型的基础上,提供了消息驱动机制,用于多线程之间的通信。基于消息驱动机制的线程通信模型陈伟线程消息通信。在标准线程模型中,线程执行完毕后便退出,而Android扩展了线程的退出机制,在启动线程时,可以首先在线程内部创建一个消息队列,然后让线程进入一个无限循环中,在这个无线循环中,线程会不断检查消息队列中是否有消息。如果需要线程执行某个任务,便向线程的消息队列中发送对应该任务的消息,线程在无线循环中检查到消息队列中有消息到来,便会获取该消息,进而执行该消息对应的处理流程。如果线程的消息队列中没有消息,线程便进入等待状态,等待消息的到来。这样便通过消息控制线程的执行,因此也称为消息驱动机制。
消息驱动机制中主要涉及4个概念:消息、消息队列、消息循环、消息处理器,分别对应Message、MessageQueue、Looper、Handler这四个类。
什么是Looper线程
Android基于Java标准线程模型开发了Looper线程,用于实现消息驱动机制。Looper线程与标准线程的区别在于:Looper线程的run方法执行后并不会立即退出,而是进入一个Loop消息循环中等待消息的到来,然后根据消息类型分别作出不同的处理。这样,后台只需运行单一线程,当需要定时或者不定时执行不同任务时,分别发送不同的消息给Looper线程去处理,这样就避免了频繁创建/销毁线程所带来的开销。
将一个普通线程变成Looper线程只需要以下代码:
class LooperThread extends Thread{
public Handler mHandler;
public void run(){
Looper.prepare();
mHandler = new Handler(){
public void handleMessage(Message msg){
//在这里处理消息
}
};
Looper.loop();//Looper线程循环阶段
}
}
在run()方法中,执行了一下三步操作:
1)调用Looper.prepare方法进入Looper线程准备阶段;
2)创建Handler对象用于实现消息处理器,消息处理器负责发送和处理消息;
3)调用Looper.loop方法进入Looper线程循环阶段。
通过以上三步,Looper线程提供了消息驱动机制的消息队列、消息循环和消息处理器,此后便可以接收消息了。
下一篇文章将详细介绍创建线程消息队列和线程消息循环的过程。
Android线程消息通信(一)的更多相关文章
- Android线程消息通信(二)
创建线程消息队列 Android应用程序的消息队列是使用一个MessageQueue对象来描述的,它可以通过调用Looper类的静态成员函数prepareMainLooper或者prepare来创建, ...
- Android线程间通信机制——深入理解 Looper、Handler、Message
在Android中,经常使用Handler来实现线程间通信,必然要理解Looper , Handler , Message和MessageQueue的使用和原理,下面说一下Looper , Handl ...
- Android线程间通信更新UI的方法(重点分析EventBus)
Android的UI更新只能在UI线程中,即主线程.子线程中如果要进行UI更新,都是要通知主线程来进行. 几种实现方式总结如下,欢迎补充. 1.runOnUiThread() 子线程中持有当前Acti ...
- Python并发编程之线程消息通信机制任务协调(四)
大家好,并发编程 进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 . 前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程 ...
- android 线程间通信
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 1,共享内存 变量 2,文件,数据库 3,处理器 消息机制 4, 线程 的 等待,通知 ...
- Android线程间通信的几种实现方式
1. 通过Handler机制: private void one() { handler=new Handler(){ @Override public void handleMessage(Mess ...
- android Handler消息通信
1 package com.example.testhandler; 2 3 import android.os.Bundle; 4 import android.os.Handler; 5 impo ...
- Android线程通信
摘要 andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传 ...
- android线程间通讯
近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图 ...
随机推荐
- NOJ1066-堆排序
堆排序 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 414 测试通过 : 220 比 ...
- shell括号操作符
以下以bash环境下做解说 一.单小括号() 二.双小括号(()) 可作数值条件操作,也可作数值运算使用(近似于 let 命令) 如 C 语言语法一样,支持运算符:<<.<<= ...
- PBOC规范(2.0->3.0)对照表
1 数据方面 TAG PBOC2.0 ...
- WebApp JS 打开 app
产品需求:分享出去的链接比如到微信朋友圈,微博的H5页面,添加一个按钮 open App 用来打开并启动自己公司的APP (如果当前手机已经安装自己公司的APP) 废话少说直接上代码: <inp ...
- SQL Server中查询用户的对象权限和角色的方法
--SQL Server中查询用户的对象权限和角色的方法 -- 查询用户的object权限 exec sp_helprotect NULL, 'sa' -- 查询用户拥有的role exec sp_h ...
- 2.Knockout.Js(监控属性Observables)
前言 1.创建一个ViewModel <script type="text/javascript"> //1.创建一个ViewModel var myViewModel ...
- random_names随机名字生成
// 先从txt文件中获取姓和名数组 - (void)getNames{ NSString *resourcePath1 = [[NSBundle mainBundle] pathForResourc ...
- FPGA保留信号的语句
(*synthesis,keep*) (*synthesis,probe_port,keep *) 例:(*synthesis,probe_port,keep *) wire e; 可用于wire型和 ...
- VBS基础篇 - 常用函数
Option Explicit '*********************************Date/Time函数******************************* 'CDate函 ...
- Android -- 经验分享(二)
目录 自定义两个View进行画图,让 ...