`
moyue
  • 浏览: 25718 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android中Handler,Looper,Message的疑问

阅读更多

最近做的项目中涉及到线程间通信,我先把我的项目说下:

    Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService),在padService中会启动一个线程(暂定为Thread-3)发起Socket连接。我们项目中使用mina作为socket通信框架,用过mina的同志们应该熟悉,Thread-3只是负责监听,具体的消息处理是另外的线程。在我们的IoHandler中处理消息,现在的问题是,我需要在IoHander的sessionOpened方法中给Activity一个消息去更新UI界面,这个就涉及到不同线程间的通信了。

   网上搜索后,在android中线程间通信使用Handler,Looper,Message这几个对象(不熟悉这些概念的同志们请自己查下)。

   这是网上的一个使用例子:

 

public class Activity2 extends Activity implements OnClickListener{

       Button button = null;

       TextView text = null;

       MyHandler mHandler = null;

       Thread thread ;

       @Override

       protected void onCreate(Bundle savedInstanceState) {

              super.onCreate(savedInstanceState);

              setContentView(R.layout.activity1);         

              button = (Button)findViewById(R.id.btn);

              button.setOnClickListener(this);

              text = (TextView)findViewById(R.id.content);

       }

       public void onClick(View v) {

              switch (v.getId()) {

              case R.id.btn:

                     thread = new MyThread();

                     thread.start();

                     break;

              }             

       }      

       private class MyHandler extends Handler{              

              public MyHandler(Looper looper){

                     super(looper);

              }

              @Override

              public void handleMessage(Message msg) {//处理消息

                     text.setText(msg.obj.toString());

              }             

       }

       private class MyThread extends Thread{

              @Override

              public void run() {

                     Looper curLooper = Looper.myLooper();

                     Looper mainLooper = Looper.getMainLooper();

                     String msg ;

                     if(curLooper==null){

                            mHandler = new MyHandler(mainLooper);

                            msg = "curLooper is null";

                     }else{

                            mHandler = new MyHandler(curLooper);

                            msg = "This is curLooper";

                     }

                     mHandler.removeMessages(0);

                     Message m = mHandler.obtainMessage(1, 1, 1, msg);

                     mHandler.sendMessage(m);

              }             

       }

}

 

 

这个没有问题,基本上三个对象的使用也很清楚,myHandler虽然是由子线程new出来的,但主线程持有引用,在我们的项目中不能用,因为我们几个线程属于不同的类,我尝试用下面的方法解决:

 

    在IoHandler中new一个android的handler,参数为主线程的Looper:

 

 

new Handler(Looper.getMainLooper()).sendMessage(msg);

IoHandler所在的线程给主线程发送消息(looper是主线程的,消息也就放在主线程的消息队列里了)

但是在主线程的handleMessage方法中得不到消息,尝试失败。

 

    那么怎么办呢,让IoHandler持有主线程的handler引用,具体做法有两种方式:

    1.  参数传递,把主线程的handler通过参数传递的形式传到IoHandler中。

    2. 静态变量,把主线程的handler申明为公共静态变量

 

public static Handler mainHandler;

 这样在Iohandler中使用

 

welcomeActivity.mainHandler.sendMessage(msg);

 这两种方式在主线程的  handleMessage的方法中都可以得到IoHandler发送的消息。

 本人使用的是静态变量解决的,因为有好几个来实现通信,参数传递太麻烦。

 

 那为什么我的第一种尝试是失败的呢,我是把消息放到主线程的消息队列了啊,这就要看android的一些实现机制了。

 通过网络和android的api,本人的理解如下:

 Looper是MessageQueue和Handler沟通的桥梁,Handler通过Looper把消息放入消息队列(MessageQueue),你想把消息发给谁,就把谁的looper作为参数传给Handler

 

newHandler(Looper looper);

  Looper把消息放入消息队列,并广播消息,这个不太好理解,我举例如下:

 

   主线程的Handler我们这样定义:Handler mainHandler = new Handler();  如果Handler没有参数,默认为当前线程的Looper

   子线程的Handler我们这样定义: Handler subHandler = newHandler(Looper.getMainLooper()); 参数为主线程的Looper

 这样两个线程都会把消息放入主线程的消息队列里了。

   现在mainHandler.sendMessage(), 消息进入主线程的消息队列,Looper广播消息,其实就是调用mainHandler的dispatchMessage方法,所有持有mianHandler引用的类都可以收到消息,注意啊,现在subHandler并不能接受到消息,因为Looper并没有调用subHandler的dispatchMessage方法,所以应该这样理解广播,A发送消息,那么A的Looper就调用A的dispatchMessage方法,别的B,C, D虽然也是A的Looper,但没有A的引用,所以B,C,D是接受不到消息的,如果B, C,D持有A的引用,但B,C,D不用A的Looper,那么也是接受不到消息的。这点在开发时要特别注意。

 

  以上是我在使用Looper, Handler ,Message中的一些问题,可能有理解错的地方,请大大们指出来。

  我的疑惑是难道子线程必须持有主线程的引用才可以给主线程发送消息吗?要知道我们的子线程并不一定和主线程一个类,可能在别的类中,这个引用传递实在太麻烦了,期望有更好的解决方式。

 

 

分享到:
评论
2 楼 moyue 2011-08-04  
请看清楚我的项目环境,mina的IoHandler是由mina自己启动的线程,无法使用AsncTask,除非设置成同步通信,我的通信过程是异步的。

   在同步环境下很好做了,直接通过AsncTask连接socket,通信是同步的,消息处理时异步的,肯定没有问题。
1 楼 zouzhiyi2010 2011-08-04  
线程间通信用AsncTask不是很好吗?

相关推荐

    Android Handler Looper Message 使用示例

    在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...

    Handler Looper MessageQueue 源码解析

    在Android系统中,Handler、Looper和MessageQueue是实现线程间通信的核心组件,它们共同构建了一个消息处理机制。本文将深入解析这三者的源码,帮助你理解它们的工作原理,并教你如何手写一套自己的Handler系统。 ...

    Thread,Looper,Handler,Message,MessageQueue,MessagePool之间的关系

    在Android系统中,线程(Thread)、Looper、Handler、Message以及MessageQueue和MessagePool是实现异步消息处理机制的关键组件,它们共同构建了一个高效的事件驱动模型。这些组件的关系紧密,协同工作,使得Android...

    自定义Handler-Looper实现线程间通信

    在主线程(UI线程)中创建一个Handler实例后,我们可以在这个Handler中发送Message到Message Queue,然后由Looper取出并分发给相应的Handler进行处理。这样,即使Message是在其他线程中生成的,它们也能在正确的线程...

    android线程handler、message、looperDEMO

    `Handler`、`Message`和`Looper`是Android系统提供的一个关键机制,用于在不同的线程间进行通信,特别是主线程(UI线程)与工作线程间的交互。下面将详细解释这三个组件以及它们如何协同工作。 1. **Handler...

    Handler+Looper+MessageQueue

    【Android 线程间通信:Handler、Looper 和 MessageQueue 深度解析】 在 Android 应用开发中,为了保证界面的流畅性,我们通常需要将耗时操作放在非 UI 线程中执行,然后通过某种机制将结果传递回 UI 线程进行界面...

    Android Handler Looper

    在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制,尤其是在主线程与工作线程之间同步数据和执行UI更新时。Handler、Looper和Message三者结合使用,构建了一个消息处理系统,使得非UI线程...

    Android_Handler,Looper,Message

    在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信和异步处理的关键组件。它们共同构建了一个消息循环系统,使得应用程序可以在不同的线程之间传递和处理消息,尤其是在主线程(UI线程)与工作线程...

    Message,MessageQueue,Looper,Handler详解

    综上所述,Message、MessageQueue、Looper和Handler这四个组件共同构成了Android应用程序中处理消息的基本机制。通过它们之间的相互协作,使得应用程序能够在不同的线程间高效地传递和处理消息,从而实现了复杂的...

    handler与looper及messagequeue的简单总结

    在Android开发中,Handler、Looper和MessageQueue是用于实现线程间通信的关键组件,它们共同构建了一个消息处理机制。理解这三个概念以及它们之间的关系对于优化应用程序的性能和响应性至关重要。 Handler(处理器...

    Android应用源码之HandlerLooper2_Android.zip

    在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制,尤其是在主线程..."Android应用源码之HandlerLooper2_Android.zip"中的源码示例可以帮助我们更好地理解这些概念,并将其应用到实际项目中。

    安卓Android源码——HandlerLooper2.rar

    这个压缩包“安卓Android源码——HandlerLooper2.rar”可能会包含对这些概念的实例解析,比如如何自定义`Handler`,如何在子线程中使用`Looper`,以及如何调试和优化消息传递等。通过学习这些源码,开发者可以更深入...

    Android 之 Looper、MessageQueue、Handler 与消息循环

    本篇文章将深入探讨Android中消息处理的核心组件——Looper、MessageQueue、Handler以及消息循环的工作原理。理解这些概念对于构建响应迅速、用户友好的应用程序至关重要。 #### 二、核心概念 ##### 1. Looper ...

    Android应用源码之HandlerLooper1_Android.zip

    这个压缩包“Android应用源码之HandlerLooper1_Android.zip”可能包含了一个示例项目,详细展示了如何在Android应用程序中使用这些组件。 首先,我们来深入理解`Handler`。`Handler`是Android中的一个关键类,主要...

    android多线程handler/message机制详解

    Looper 负责从其内部的 MessageQueue 中拿出一个个的 Message 给 Handler 进行处理。 Message 是什么?Message 是后台进程返回的数据,里面可以存储 Bundle 等数据格式。MessageQueue 是线程对应 Looper 的一部分,...

    Android单线程模型中Message、Handler、Message Queue、Looper之间的关系---附实例源码

    消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理,在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件...

    安卓Android源码——HandlerLooper1.rar

    在Android系统中,`Handler`、`Looper`和`MessageQueue`是三个核心组件,它们共同构成了Android消息处理机制,使得应用程序能够实现线程间的通信和异步任务执行。这个`HandlerLooper1.rar`文件可能包含了对这些概念...

    Android 异步处理 Handler+Looper+MessageQueue深入详解

    Handler、Looper和MessageQueue是Android异步处理机制中的核心组件,它们共同构建了一个消息传递系统,使得在不同线程间进行数据交换变得可能。下面我们将深入探讨这三个组件的工作原理及其在实际开发中的应用。 ...

    Android应用源码之HandlerLooper1.zip

    本资料“Android应用源码之HandlerLooper1.zip”应该是包含了一个关于这些组件的详细示例或分析,让我们来深入探讨它们的工作原理。 首先,`Handler`是Android中的一个类,它用于在UI线程中发送和处理消息。当你...

    Android的Message机制(Handler、Message、Looper)

    在Android开发中,消息机制是一个非常重要的概念,它由多个核心组件组成,包括`Handler`、`Message`、`Looper`等。这一机制支持了应用程序内部以及应用程序间的通信。下面将详细介绍这些组件的功能与协作方式。 ###...

Global site tag (gtag.js) - Google Analytics