摘要

  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线程通信的更多相关文章

  1. Android线程间异步通信机制源码分析

    本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础 ...

  2. android 36 线程通信

    安卓中一个程序跑起来叫进程,进程中至少有一个主线程.主线程用于处理用户的触摸操作和将触摸操作事件分发给响应的控件.如果进行消耗时间操作,下载,磁盘读取文件,不润许在主线程操作,只能在工作线程操作.主线 ...

  3. Android中线程通信的方式

    Android 跨线程通信 android 中是不允许在主线程中进行 网络访问等事情的因为UI如果停止响应5秒左右的话整个应用就会崩溃,到Android4.0 以后 Google强制规定,与网络相关的 ...

  4. Android线程管理(一)——线程通信

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  5. Android多线程通信机制

    掌握Android的多线程通信机制,我们首先应该掌握Android中进程与线程是什么. 1. 进程 在Android中,一个应用程序就是一个独立的进程(应用运行在一个独立的环境中,可以避免其他应用程序 ...

  6. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  7. Android线程管理(二)——ActivityThread

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  8. android线程间通讯

    近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图 ...

  9. android 线程

    android线程: 通用多个线程通信管理框架: 1.Handler监听者框架:子线程是事件源,主线程是监听者.        Handler作为子线程的监听器出现:主线程中生成Handler的子类, ...

随机推荐

  1. 【MySQL】乐观锁和悲观锁

    最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持 ...

  2. 【MySQL】MySQL之MySQL5.7安装包(msi文件)在Windows8下安装

    最近自己在使用MySQL5.7.16.msi安装MySQL.自己下载的是.msi文件,在安装的过程中遇到了许多文件,网上大部分的Blog都是关于免安装包的安装方法,希望我的方法对大家有帮助. 1,下载 ...

  3. iOS中app的分发测试

    知识的学习在于分享.分享出来才能共同进步. 关于测试 有几种方式 1.开发人员直接在电脑上 用模拟器 2. 真机调试,测试人员可以拿着测试机找开发人员在电脑上跑真机测试 3. 公司和个人账号  直接 ...

  4. 【colaboratory】ModuleNotFoundError: No module named 'forward'

    在colaboratory中,import 自己写的 py 文件往往会爆出 ModuleNotFoundError: No module named ‘forward' 的错误. 就其原因,是由于 D ...

  5. React icon bak

  6. PreparedStatement的用法及优点

    jdbc(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力.在使用statem ...

  7. 豆瓣上9分以上的IT书籍-编程技术篇

    在豆瓣上9分以上的IT书籍-编程语言篇中,收集了很多优秀的编程语言书籍,也得到了不少读者的喜欢.不过也有一些读者留言说某某书为什么没有,一种是因为某些书并不算讲某种编程语言的,一种是由于豆瓣9分以上这 ...

  8. SharePoint 2013 Farm 安装指南——构建一个双层SharePoint Farm

    最近要对公司里的SharePoint进行升级,由于旧的系统SharePoint 2010已经有2年了,上面改动比较多,而且权限也很混乱了,所以下定决心要对其做一次升级,重新部署一台新的SharePoi ...

  9. 第二篇:呈现内容_第二节:WebControl呈现

    一.WebControl的呈现过程 WebControl派生自Control类,所以WebControl的呈现功能基于Control的呈现逻辑之上,但有了比较大的扩展. 首先,WebControl重写 ...

  10. Redis介绍及安装

    官网:https://redis.io/ Redis中文社区:http://www.redis.net.cn/ Redis教程:http://www.redis.net.cn/tutorial/350 ...