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线程通信,布布扣,bubuko.com

时间: 2024-07-30 13:20:30

Android线程通信的相关文章

android线程通信之Handler

android中线程分为两种: 1)系统创建的用于处理UI界面和用户交互事件的主线程 2)自己创建的用于实现其他业务的子线程 UI中的控件是线程不安全的,只能在主线程中操作控件,不能在其他子线程中直接操作控件. 如果想在其他线程中操作主线程中的控件,只能通过发送一个消息告诉主线程去更新界面. 为了便于在线程间发送消息进行通信,android实现了Handler机制. 线程间通过Handler传递消息(Message).Message由一个FIFO的消息队列(MessageQueue)管理. 每个

Android线程管理——线程通信

线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用.本小节主要从以下三个方面进行分析: <Android线程管理--线程通信> <Android线程管理--ActivityThread> <Android线程管理--Thread> 一.Handler.MessageQueue.Message及Looper四者的关系 在开发A

android 36 线程通信

安卓中一个程序跑起来叫进程,进程中至少有一个主线程.主线程用于处理用户的触摸操作和将触摸操作事件分发给响应的控件.如果进行消耗时间操作,下载,磁盘读取文件,不润许在主线程操作,只能在工作线程操作.主线程向工作线程发送消息和数据,工作线程也会时时反馈给主线程.线程通信:多个线程互相收发消息和数据. 安卓规定只有主线程才能修改UI界面和控件(除了进度条可以在工作线程修改),如果工作线程想修改UI界面则只能通知主线程进行修改. Handler:句柄,手柄,遥控器,操作板. mainActivity:

Android 主线程和子线程通信问题

Android 现在不支持View在子线程中创建及调用其方法.如果要实现子线程内容更新之后,将结果及时反馈到主线程中,该如何出来呢? 可以在主线程中创建Handler来实现. 这样子线程的结果,可以通过发消息的形式,通知主线程,然后主线程中去及时更新View控件. Handler的使用方式: mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg);

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

一.Handler.MessageQueue.Message及Looper四者的关系 在开发Android多线程应用时,Handler.MessageQueue.Message及Looper是老生常谈的话题.但想彻底理清它们之间的关系,却需要深入的研究下它们各自的实现才行.首先,给出一张它们之间的关系图: Looper依赖于MessageQueue和Thread,因为每个Thread只对应一个Looper,每个Looper只对应一个MessageQueue. MessageQueue依赖于Mes

android线程间通讯

近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的. 在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 概念.我们的主线程(UI线程)就是一个消息循环的线程.针对这种消息循

优化 Android 线程和后台任务开发

在 Android 开发中,你不应该做任何阻碍主线程的事情.但这究竟意味着什么呢?在这次海湾 Android 开发者大会讲座中,Ari Lacenski 认为对于长时间运行或潜在的复杂任务要特别小心.这一次演讲,我们将根据一个真实场景应用的需求,讨论 AsyncTask, Activity, 和 Service,逐步建立一个更易于维护的解决方案. Android 线程 (0:46) 当我们谈论线程,我们知道一个 Android 应用程序至少有一个主线程.这个线程是随着你的Application 

android IPC通信(下)-AIDL

android IPC通信(上)-sharedUserId&&Messenger android IPC通信(中)-ContentProvider&&Socket 这篇我们将会着重介绍AIDL的使用方式和原理,要介绍AIDL先要简单介绍一下Binder,而且Messenger,ContentProvider和AIDL的最底层都是使用的Binder. Binder 直观来说,Binder是Android中的一个类,它实现了IBinder接口.从IPC角度来说,Binder是A

Android线程篇

在Android中,UI主线程并非线程安全的,所有UI相关的操作均需在UI主线程中完成.在默认情况下,开发者创建的Service.Activity.Broadcast均运行在UI主线程中,但将一些耗时操作,如网络下载.大文件读写.加解密计算.数据库操作等,也放在UI线程中执行,往往会阻塞UI线程,造成ANR异常,因此,在Android应用开发中,应特别注意线程的使用. 在Android中,实现多线程的方式有多种,开发者可以通过原生Java线程或Android对Java线程的封装即AsyncTas