Android线程通信
摘要
andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。
正文
图解:

代码示例:
/**
* @author allin.dev
* http://allin.cnblogs.com
*/
public class MainThread extends Activity
{ private static final String TAG = "MainThread";
private Handler mMainHandler, mChildHandler;
private TextView info;
private Button msgBtn; @Override
public void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
setContentView( R.layout.main ); info = (TextView) findViewById( R.id.info );
msgBtn = (Button) findViewById( R.id.msgBtn ); mMainHandler = new Handler( )
{ @Override
public void handleMessage( Message msg )
{
Log.i( TAG, "Got an incoming message from the child thread - "
+ (String) msg.obj );
// 接收子线程的消息
info.setText( (String) msg.obj );
} }; new ChildThread( ).start( ); msgBtn.setOnClickListener( new OnClickListener( )
{ @Override
public void onClick( View v )
{ if ( mChildHandler != null )
{ // 发送消息给子线程
Message childMsg = mChildHandler.obtainMessage( );
childMsg.obj = mMainHandler.getLooper( ).getThread( ).getName( )
+ " says Hello";
mChildHandler.sendMessage( childMsg ); Log.i( TAG, "Send a message to the child thread - "
+ (String) childMsg.obj ); }
}
} ); } public void onDestroy() {
super.onDestroy();
Log.i(TAG, "Stop looping the child thread's message queue"); mChildHandler.getLooper().quit();
} class ChildThread extends Thread
{ private static final String CHILD_TAG = "ChildThread"; public void run( )
{
this.setName( "ChildThread" ); // 初始化消息循环队列,需要在Handler创建之前
Looper.prepare( ); mChildHandler = new Handler( )
{
@Override
public void handleMessage( Message msg )
{
Log.i( CHILD_TAG, "Got an incoming message from the main thread - "
+ (String) msg.obj ); try
{ // 在子线程中可以做一些耗时的工作
sleep( 100 ); Message toMain = mMainHandler.obtainMessage( );
toMain.obj = "This is " + this.getLooper( ).getThread( ).getName( )
+ ". Did you send me \"" + (String) msg.obj + "\"?"; mMainHandler.sendMessage( toMain ); Log.i( CHILD_TAG, "Send a message to the main thread - "
+ (String) toMain.obj ); }
catch ( InterruptedException e )
{
// TODO Auto-generated catch block
e.printStackTrace( );
}
} }; Log.i( CHILD_TAG, "Child handler is bound to - "
+ mChildHandler.getLooper( ).getThread( ).getName( ) ); // 启动子线程消息循环队列
Looper.loop( );
}
}
}
ps:
使用HandlerThread的looper对象创建Handler,如果使用默认的构造方法,很有可能阻塞UI线程,参考http://www.cnblogs.com/ccdc/p/3837798.html。改进方案新开一个线程将主线程的handler使用新开线程的looper替代主线程looper,示意图如下,

参考
shangdawei.android 线程间通信[2014-07-11](2013-03-26).http://www.cnblogs.com/shangdawei/archive/2013/03/26/2983217.html
Android线程通信的更多相关文章
- Android线程间异步通信机制源码分析
本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础 ...
- android 36 线程通信
安卓中一个程序跑起来叫进程,进程中至少有一个主线程.主线程用于处理用户的触摸操作和将触摸操作事件分发给响应的控件.如果进行消耗时间操作,下载,磁盘读取文件,不润许在主线程操作,只能在工作线程操作.主线 ...
- Android中线程通信的方式
Android 跨线程通信 android 中是不允许在主线程中进行 网络访问等事情的因为UI如果停止响应5秒左右的话整个应用就会崩溃,到Android4.0 以后 Google强制规定,与网络相关的 ...
- Android线程管理(一)——线程通信
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Android多线程通信机制
掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Android线程管理(二)——ActivityThread
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- android线程间通讯
近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图 ...
- android 线程
android线程: 通用多个线程通信管理框架: 1.Handler监听者框架:子线程是事件源,主线程是监听者. Handler作为子线程的监听器出现:主线程中生成Handler的子类, ...
随机推荐
- HTML 5 应用程序缓存(Application Cache)cache manifest 文件使用 html5 中创建manifest缓存以及更新方法 一个manifest文件会创建一份缓存,不同的manifest文件其缓存的内容是互不干扰的
HTML5 离线缓存-manifest简介 HTML 5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(A ...
- C语言学习笔记 (010) - 编写strcpy函数
很多公司的面试官在面试程序员的时候,要求应聘者写出库函数strcpy()的工作方式或者叫实现,很多人以为这个题目很简单,实则不然,别看这么一个小小的函数,它可以从三个方面来考查: (1)编程风格 (2 ...
- magento的一些小技巧(转)
1.加载某个attribute: $attributeCode=Mage::getModel('catalog/resource_eav_attribute') ...
- MS SQL Server查询优化方法 查询速度慢的原因很多,常见如下几种
1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...
- Docker 的技术组件
Docker可以运行于任何安装了现代Linux内核的x64主机上.推荐的内核版本是3.8或者更高.Docker的开销比较低,可用于服务器.台式机或者笔记本.它包括以下几个部分. 一个原生的Linux容 ...
- 【转】DRY原则的误区
很多编程的人,喜欢鼓吹各种各样的“原则”,比如KISS原则,DRY原则…… 总有人把这些所谓原则奉为教条或者秘方,以为兢兢业业地遵循这些,空喊几个口号,就可以写出好的代码.同时,他们对违反这些原则的人 ...
- 独立的android开发者开发app如何盈利?
对立android开发者开发app如何盈利?android开发日益兴隆,随着google的大力推广和技术及其android培训的支持,android个人开发者或者android独立开发者也都匆匆欲动加 ...
- 支付接口中常用的加密解密以及验签rsa,md5,sha
一.常用加密类型分类 1.对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密.此类型称之为对称加密.特点速度快,常用于对大量数据信息或文件加密时使用.常用例子:D ...
- scrapy定时执行抓取任务
在ubuntu环境下,使用scrapy定时执行抓取任务,由于scrapy本身没有提供定时执行的功能,所以采用了crontab的方式进行定时执行: 首先编写要执行的命令脚本cron.sh #! /bin ...
- Flume 相关
在CentOS 7上安装配置Flume https://mos.meituan.com/library/41/how-to-install-flume-on-centos7/ Flume NG 学习笔 ...