摘要

  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. 用UltraEdit判断打开文件的编码类型 用UltraEdit或notepad记事本查看文件编码格式 用UltraEdit查看当前文件编码

    用UltraEdit查看当前文件编码 想判断文件的编码类型? 用强大的UltraEdit-32软件: UltraEdit-32的状态栏可以显示文件的编码类型,详细情况如下: ANSI/ANSCI--- ...

  2. VC设置视图背景颜色方法

    视图的背景一般来说是白色的,在缺省情况下,它和系统定义的颜色COLOR_WINDOW是一致的.设计者一般会希望自己的程序可以让用户轻松地改变窗口背景颜色,或是用漂亮的图片来充填背景.我们可以用Wind ...

  3. 微信公众平台HTTPS方式调用配置免费https服务器

    微信公众平台数据传输安全,提高业务安全性,公众平台将不再支持HTTP方式调用.避免影响正常使用中含有HTTP方式调用的服务,请开发者尽快调整,将现有通过HTTP方式调用的切换成HTTPS调用,平台将于 ...

  4. SqlServer 2005 将已存在大量数据的表更改为分区表

    一.分区表简介: 使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性.分区一方面可以将数据分为更小.更易管理的部分,为提高性能起到一定的作用:另一方面,对于如果具有多个 ...

  5. ==和equals的简单比较

    前言:==和equals这个两个东西,经常放在一块做比较,下面我也给出一个简单的例子,对他俩进行一个简单的比较,先看例子,然后在看结论.(实验环境:win7+jdk7) 1:==和equals简单比较 ...

  6. sort_area_size,sort_area_retained_size

    sort_area_sizeoracle不建议设置sort_area_size参数.除非实例被配置成了共享服务器模式.默认值已经足够满足大多数OLTP系统.如果是OLAP.批任务.创建大的索引,可能需 ...

  7. nmapport状态解析

  8. Keras 2.0版本运行

    Keras 2.0版本运行demo出错: d:\program\python3\lib\site-packages\ipykernel_launcher.py:8: UserWarning: Upda ...

  9. Java 8 – Stream Collectors groupingBy count examples

    Java 8 – Stream Collectors groupingBy count examples 1. Group By, Count and Sort1.1 Group by a List ...

  10. springboot 中使用Druid 数据源提供数据库监控

    一.springboot 中注册 Servlet/Filter/Listener 的方式有两种,1 通过代码注册 ServletRegistrationBean. FilterRegistration ...