1. Message Queue的角色
l 在你的Android程序里,新创建一个线程,或称线程(Thread)时,并不会自动建立其Message Loop。
l Android里并没有Global的Message Queue数据结构,例如,不同APK里的对象不能透过Massage Queue来交换消息(Message)。
l 一个线程可以创建一个Looper对象,由它来管理此线程里的Message Queue。
l 你可以创建Handler对象来与Looper沟通,以便push新消息到Message Queue里或者接收Looper(从Message Queue取出)所送来的消息。
l 线程A的Handler对象引用可以传递给别的线程,让别的线程B或C等能发送消息来给线程A(存于A的Message Queue里)。
l 线程A的Message Queue里的消息,只有线程A所属的对象可以处理之。
l 使用Looper.myLooper可以取得目前线程的Looper对象引用。
l 使用mHandler = new EventHandler(Looper.myLooper());可创建用来处理目前线程的Handler对象;其中,EventHandler是Handler的子类别。
l 使用mHandler = new EventHandler(Looper.getMainLooper());可创建用来处理main线程的Handler对象;其中,EventHandler是Handler的子类别。
2. 范例之一:Looper类之角色
Looper类别用来管理特定线程内对象之间的消息交换(Message Exchange)。你的应用程序可以创建许多个线程,或称线程(Thread)。而一个线程可以实例化许多个对象,这些对象之间常常需要互相交换消息。如果有这种需要,您可以替线程创建一个Looper类对象,来处理信息交换的管理工作。Looper对象会建立一个MessageQueue数据结构来存放各对象传来的消息(包括UI事件或System事件等)。如下图:
每一个线程(Thread,或称「线程」)里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。
//----- Looper_01范例 -----
package com.misoo.kx04;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ac01 extends Activity implements OnClickListener {
private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
private final int FP = LinearLayout.LayoutParams.FILL_PARENT;
public TextView tv;
private EventHandler mHandler;
private Button btn, btn2, btn3;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
btn = new Button(this);
btn.setId(101);
btn.setBackgroundResource(R.drawable.heart);
btn.setText("test looper");
btn.setOnClickListener(this);
LinearLayout.LayoutParams param =new LinearLayout.LayoutParams(100,50);
param.topMargin = 10;
layout.addView(btn, param);
btn2 = new Button(this);
btn2.setId(102);
btn2.setBackgroundResource(R.drawable.ok_blue);
btn2.setText("exit");
btn2.setOnClickListener(this);
layout.addView(btn2, param);
tv = new TextView(this);
tv.setTextColor(Color.WHITE);
tv.setText("");
LinearLayout.LayoutParams param2 = new LinearLayout.LayoutParams(FP, WC);
param2.topMargin = 10;
layout.addView(tv, param2);
setContentView(layout);
}
public void onClick(View v) {
switch(v.getId()){
case 101: Looper looper;
looper = Looper.myLooper();
mHandler = new EventHandler(looper);
mHandler.removeMessages(0);
// 清除整个MessageQueue里的事件,确保不会通知到别人
String obj = "This my message!";
Message m = mHandler.obtainMessage(1, 1, 1, obj);
// 组装成一个Message物件
mHandler.sendMessage(m);
// 将Message物件送入MessageQueue里
break;
case 102:
finish();
break;
}
}
//------------------------------------------------------
class EventHandler extends Handler{
public EventHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
tv.setText((String)msg.obj);
}
}
}
//-------------------------------------------------------
说明:
程序启动时,当前线程(即主线程, main thread)已创建了一个Looper对象,并且有了一个MessageQueue数据结构。
指令:looper = Looper.myLooper();调用Looper类的静态myLooper()函数,以取得目前线程里的Looper对象引用。
指令:mHandler = new EventHandler(looper);创建一个EventHandler对象来与Looper沟通。Activity等对象可以通过EventHandler对象来将消息传给Looper,然后放入MessageQueue里;EventHandler对象也扮演Listener的角色,可接收Looper对象所送来的消息。如下图:
指令:Message m = mHandler.obtainMessage(1, 1, 1, obj); 先创建一个Message对象,并将数据存入次对象里。
指令:mHandler.sendMessage(m); 通过mHandler对象而将消息m传给Looper,然后放入MessageQueue里。
此时Looper对象看到MessageQueue里有消息m,就将它广播出去, mHandler对象接到此消息时,会调用其handleMessage()函数来处理之,于是输出"This my message!"于画面上,如下:
3. 范例之二:由别的线程发送到主线程的Message Queue
//----- Looper_02范例 -----
package com.misoo.kx04;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ac01 extends Activity implements OnClickListener {
private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
private final int FP = LinearLayout.LayoutParams.FILL_PARENT;
public TextView tv;
private myThread t;
private Button btn, btn2, btn3;
public void onCreate(Bundle icicle) {
//文章长度有限,代码请参考上例
}
public void onClick(View v) {
switch(v.getId()){
case 101:
t = new myThread();
t.start();
break;
case 102:
finish();
break;
}
}
//------------------------------------------------------
class EHandler extends Handler { //文章长度有限,代码请参考上例
//------------------------------------------------------
class myThread extends Thread{
private EHandler mHandler;
public void run() {
Looper myLooper, mainLooper;
myLooper = Looper.myLooper();
mainLooper = Looper.getMainLooper();
String obj;
if(myLooper == null){
mHandler = new EHandler(mainLooper);
obj = "current thread has no looper!";
}
else {
mHandler = new EHandler(myLooper);
obj = "This is from current thread.";
}
mHandler.removeMessages(0);
Message m = mHandler.obtainMessage(1, 1, 1, obj);
mHandler.sendMessage(m);
}
}
}
Android会自动替主线程建立Message Queue。 在这个子线程里并没有建立Message Queue。所以,myLooper值为null,而mainLooper则指向主线程里的Looper对象。于是,执行到指令:
mHandler = new EHandler(mainLooper); 此mHandler属于主线程。
指令:mHandler.sendMessage(m);
就将消息m存入到主线程的Message Queue里。mainLooper看到Message Queue里有消息,就会处理之,于是由主线程执行到mHandler的handleMessage()函数来处理消息。此程序输出画面为:
分享到:
相关推荐
1. **Message Queue(消息队列)的角色** - 每个线程不自动创建Message Loop,需要手动通过Looper类来建立。 - Android系统中没有全局Message Queue,不同应用或线程间的通信不能直接通过Message Queue。 - 通过...
通过阅读《android MessageQueue1.doc》、《android MessageQueue2.doc》和《android MessageQueue3.doc》,你可以更深入地了解MessageQueue的实现细节、使用技巧以及常见问题的解决方案,这对于提升Android应用的...
本篇文章将详细探讨Android的消息处理机制,特别是Message和MessageQueue这两个核心概念。 #### 二、Android消息处理机制概述 当Android应用启动后,会创建一个主进程,在这个进程中包含了UI主线程。UI主线程负责...
##### 1、MessageQueue:消息队列 MessageQueue是一种数据结构,顾名思义,它充当了一个消息队列的角色,用来存放各种消息对象。每一个线程最多只能拥有一个MessageQueue数据结构。在创建一个线程时,并不会自动...
在Android开发中,Message Queue(消息队列)是多线程通信的核心机制,尤其是在主线程(UI线程)与其他工作线程之间的交互中起到至关重要的作用。本文将深入探讨Message Queue的工作原理及其在Android中的应用。 1....
在Android系统中,Handler、Looper和MessageQueue是实现线程间通信的核心组件,它们共同构建了一个消息处理机制。本文将深入解析这三者的源码,帮助你理解它们的工作原理,并教你如何手写一套自己的Handler系统。 ...
在Android操作系统中,MessageQueue是实现线程间通信和异步处理的核心组件。它与Handler、Looper紧密协作,构成了Android消息传递机制的基础。本压缩包文件"android_os_MessageQueue.rar_android"显然关注的是这一...
- Looper会创建一个MessageQueue数据结构,用于存放消息。每个线程可以有一个Looper对象和一个MessageQueue。 3. **使用示例** ```java // 创建一个新的Handler实例,关联当前线程的Looper mHandler = new ...
在Android系统中,MessageQueue和Looper是两个非常关键的组件,它们构成了消息处理机制的核心,尤其是在UI线程中。理解并有效地使用它们对于编写高效、响应迅速的Android应用至关重要。 `Looper`是Android中的一个...
【Android 线程间通信:Handler、Looper 和 MessageQueue 深度解析】 在 Android 应用开发中,为了保证界面的流畅性,我们通常需要将耗时操作放在非 UI 线程中执行,然后通过某种机制将结果传递回 UI 线程进行界面...
在Android系统中,消息队列(Message Queue)是线程间通信的重要机制,尤其是在处理UI更新和异步任务时。然而,与Windows操作系统不同,Android并没有实现全局的消息队列来支持跨进程通信,而是主要依赖于Intent来...
在Android系统中,线程(Thread)、Looper、Handler、Message以及MessageQueue和MessagePool是实现异步消息处理机制的关键组件,它们共同构建了一个高效的事件驱动模型。这些组件的关系紧密,协同工作,使得Android...
一直以来,觉得MessageQueue应该是Java层的抽象,然而事实上MessageQueue的主要部分在Native层中。 自己对MessageQueue在Native层的工作不太熟悉,借此机会分析一下。 一、MessageQueue的创建 当需要使用Looper时...
- **MessageQueue的创建**:Looper会创建一个MessageQueue,用于存储各个对象发送的消息,包括用户界面事件和系统事件。 - **定义Handler子类**:开发者可以定义Handler的子类来接收Looper分发的消息。Handler子类...
### Android之Looper、MessageQueue、Handler与消息循环详解 #### 一、概述 在Android开发过程中,消息处理机制是至关重要的部分,它涉及到应用程序如何管理、传递和响应各种事件。本篇文章将深入探讨Android中...
Handler、Looper和MessageQueue是Android异步处理机制中的核心组件,它们共同构建了一个消息传递系统,使得在不同线程间进行数据交换变得可能。下面我们将深入探讨这三个组件的工作原理及其在实际开发中的应用。 ...
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理. 简单定义: 1、Message Queue(消息队列): 用来存放通过Handler发布的消息,通常...
我们知道android是基于Looper消息循环的系统,我们通过Handler向Looper包含的MessageQueue投递Message, 不过我们常见的用法是这样吧? 一般我们比较少接触MessageQueue, 其实它内部的IdleHandler接口有很多有趣的...
Handler有两种主要的使用方式:一是通过`sendMessage()`系列方法将Message放入MessageQueue,二是通过`handleMessage()`方法处理从Looper传来的消息。Handler还提供了`post()`方法,用于将Runnable对象放入Message...