`
itoracja
  • 浏览: 142686 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多

    <h1>Android开发之消息处理机制(一)——Handler</h1>
/*

* Android开发之消息处理机制(一)——Handler

* 北京Android俱乐部群:167839253

* Created on: 2011-8-29

* Author: blueeagle

* Email: liujiaxiang@gmail.com

*/

对于Android里的消息处理,涉及到Handler,Looper,Message,Message Queue等概念,先捋顺这些概念。

Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。

Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。

MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。

Looper:一个线程可以产生一个Looper对象,用来管理MessageQueue,它就像一个消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。

下面来先来着重说明Handler类。

Android 里面对于异步消息的处理,提供了一套Handler的实现方案。Handler有很多适宜的应用和微妙之处,使它在和Thread以及Service等一起使用的时候达到很好的效果。

下面先看看手册里对Handler是如何定义的:

A Handler allows you to send and process <code>[url=">Message</a></code> and Runnable objects associated with a thread's<code><a href=]MessageQueue[/url]</code>. Each Handler instance is associated with a single thread and that thread's message queue.
When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.

There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.

Handler 允许 你去发送和处理 消息或者是发送处理绑定在线程消息队列中的rannable对象,每一个Handler实例都联系到一个单一的线程和那个线程的消息队列中。当创建一个新的Handler,他将绑定到这个线程或者是创建Hanlder的线程的消息队列。从这一点上来看,它会传递信息和消息队列的rannables并在消息弹出消息队列时执行它们。Handler有两个主要的用途:1是调度消息和runnables在未来执行的时间;2是为不同线程中所进行的活动排队。

云里雾里的,但是好像隐约知道他是什么意思了。继续理解下去:这里就是多线程的问题了,当我们启动一个Android应用程序的时候,Android会首先开启一个主线程,这个主线程的工作主要就是管理界面中的UI控件,进行事件分发,处理消息响应函数等。但是如果处理一个比较耗时的操作时,比如读取本地大文档,读取网络数据等等时,如果依然用主线程的话,就会出现问题,Android系统规定默认5S无反应的话,就会弹出强制关闭对话框。

在这个时候我们就需要另外开一个线程来处理耗时的工作,这与在学习SurfaceView的时候,我们开启了一个线程去处理频繁更新的操作有些类似。但是因为子线程涉及到UI更新,而更新UI只能在主线程中更新(Android主线程不是线程安全的),子线程中操作是危险的。Handler就是用来解决这个复杂问题而出现的。Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sendMessage()方法传递)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。

如下面的例子:

在主Activity中,定义一个TextView,我们来实时的更新这个TextView的内容。

<textarea readonly name="code" class="java">package com.blueeagle;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class SendMessage extends Activity {
private TextView textView;
private MyHandler myHandler;//定义一个自己的Handle类
private Button button;
private MyThread m=new MyThread(); //定义一个自己的线程类
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView=(TextView)findViewById(R.id.text);
button=(Button)findViewById(R.id.startButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
myHandler=new MyHandler();
new Thread(m).start();
System.out.println("主线程运行ID:"+Thread.currentThread().getId());
}
});
}//在对UI进行更新时,执行时所在的线程为主UI线程
class MyHandler extends Handler{//继承Handler类时,必须重写handleMessage方法
public MyHandler(){

}
public MyHandler(Looper l){
super(l);
}
@Override
public void handleMessage(Message msg) {//执行接收到的通知,此时执行的顺序是按照队列进行,即先进先出
super.handleMessage(msg);
Bundle b=msg.getData();
String textStr1=b.getString("textStr");
SendMessage.this.textView.setText(textStr1);//更改TextView中的值
}
}//该线程将会在单独的线程中运行

class MyThread implements Runnable{
int i=1;
@Override
public void run() {
while(i<11){
System.out.println("当前运行线程ID:"+Thread.currentThread().getId());
try {
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
Message msg=new Message();
Bundle b=new Bundle();
b.putString("textStr", "线程运行"+i+"次");
i++;
msg.setData(b);
SendMessage.this.myHandler.sendMessage(msg);//通过sendMessage向Handler发送更新UI的消息
}
i=1;//下次启动线程时重新计数。
}
}
} </textarea><br>

XML文件:

<textarea readonly name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
<Button android:id="@+id/startButton" android:layout_height="wrap_content" android:text="Button"  android:layout_width="wrap_content"></Button>
</LinearLayout></textarea><br>

小结:

可以看到,屏幕上的TxtView在实时变化,考察线程ID可以得知是由哪一个线程来完成这项工作的。再次点击按钮后,则会触发新的线程去执行实时更新的操作。

 
0
0
分享到:
评论

相关推荐

    安卓Android源码——HandlerLooper2.rar

    - `Handler`是Android中的一个关键类,用于发送和处理消息。它主要在UI线程中创建,用于与`MessageQueue`交互。 - `post()`和`sendMessage()`是`Handler`的主要方法,用于向队列中添加延迟执行的任务或消息。 - `...

    安卓Android源码——HandlerMessage3.rar

    在安卓(Android)开发中,`Handler`、`Message` 和 `Looper` 是实现线程间通信的关键组件,尤其在...通过深入研究这个"安卓Android源码——HandlerMessage3.rar",你可以更好地理解这些机制,并在你的应用中灵活运用。

    安卓Android源码——HandlerMessage2.rar

    本资源"安卓Android源码——HandlerMessage2.rar"可能包含了关于`Handler`和`Message`的深入实践和示例代码,下面我们将详细探讨这些核心组件。 `Handler` 是 Android 中用于在线程间传递消息的对象。它通常用于将...

    安卓Android源码——HandlerLooper1.rar

    在Android开发中,通常会用到以下几种`Handler`的用法: 1. **延时执行**:通过`sendMessageDelayed()`可以设置消息在未来的某个时间点被处理。 2. **取消消息**:`removeCallbacksAndMessages()`方法可以取消已经...

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

    在Android开发过程中,消息处理机制是至关重要的部分,它涉及到应用程序如何管理、传递和响应各种事件。本篇文章将深入探讨Android中消息处理的核心组件——Looper、MessageQueue、Handler以及消息循环的工作原理。...

    安卓Android源码——HandlerMessage1.rar

    在安卓(Android)开发中,`Handler`、`Message` 和 `Looper` 是三个非常重要的组件,它们共同构成了安卓的异步消息处理机制。这个机制是安卓系统中处理UI线程与后台线程通信的核心方式。`HandlerMessage1.rar` 文件...

    Google.Android开发入门与实战第12章.Android综合案例一——RSS阅读器实例

    在本章节中,“Google.Android开发入门与实战第12章.Android综合案例一——RSS阅读器实例”主要聚焦于Android应用程序开发中的一个实际应用场景——构建一个RSS阅读器。这个实例将帮助初学者理解如何将Android SDK的...

    android——多线程

    在Android开发中,多线程是一项至关重要的技术,特别是在处理耗时操作时,如网络请求、数据解析等,以避免阻塞主线程导致用户界面(UI)无响应。标题"android——多线程"和描述"android——Handler与多线程应用范例...

    解析Google Android SDK——智能手机开发范例手册-下载代码

    总的来说,《解析Google Android SDK——智能手机开发范例手册》覆盖了Android开发的多个重要方面,从基础环境到高级技术,为开发者提供了全面的学习资源。通过深入研究这些章节,开发者不仅可以构建功能丰富的...

    Android Handler解析

    为了解决这个问题,Android提供了一种非阻塞的消息传递机制——Handler。 ## Handler基础概念 ### 什么是Handler? Handler是Android框架中的一个核心组件,它提供了一个非阻塞的消息传递机制。通过Handler,可以...

    android多线程机制

    Android多线程机制是Android开发中非常重要的一部分,尤其是在处理耗时任务(如网络请求、大数据处理等)时,避免阻塞UI线程,保证应用程序的流畅性和响应性。本文将详细介绍Android多线程的基本原理及其核心组成...

    Android开发与应用——张荣,原书配套课件

    实验一 Android开发环境搭建 实验二 界面设计:基本组件 实验三 界面设计:布局管理器 实验四 多线程应用 实验五 基于文件的日程安排 实验六 基于SQLite的通信录 实验七 天气预报应用 实验八 音乐播放器及...

    从现实生活中理解android线程消息机制.pdf

    让我们通过一个具体的案例来进一步阐述这一机制——假设我们在听歌时需要实现歌词同步功能。为了不影响用户界面的流畅性,我们可以创建一个新的线程专门处理歌词的滚动。在线程中,我们可以根据歌曲的播放时间...

    Android 高级开发面试题以及答案整理

    ### Android高级开发面试题——Handler相关知识 #### 一、HandlerLooperMessage关系 **1. Handler、Looper与Message之间的关系** - **Handler**: 主要用于发送消息和处理消息。它作为一个桥梁,使得主线程和子...

    Android Handler线程间的调度

    在Android开发中,Handler、Looper和Message是实现线程间通信的重要组件,它们共同构成了Android的消息处理机制。本文将深入探讨“Android Handler线程间的调度”这一主题,并结合提供的资源——MessageProject,来...

    移动应用开发——Android.zip

    在编程实践中,异步处理是必不可少的,Android提供了Intent、Handler、AsyncTask、Retrofit等机制来处理非阻塞操作。此外,对于数据存储,Android提供了SQLite数据库、SharedPreferences、文件系统等多种方式,...

    安卓Android源码——应用开发揭秘源码.zip

    《安卓Android源码——应用开发揭秘》是一本深入解析Android应用开发背后原理和技术的书籍,其源码对应压缩包提供了丰富的实践案例和详细注解,是开发者深入理解Android系统及应用开发的重要参考资料。通过分析这些...

    安卓Android源码——浮动窗口播放器.zip

    【标题】"安卓Android源码——浮动窗口播放器"指的是一个专门为Android平台设计的应用程序源代码,它允许视频在屏幕的任何位置以浮动窗口的形式进行播放。这种功能常见于一些多任务处理的应用,如音乐播放器或视频...

    Android中文翻译组——Android中文合集(6)

    综上所述,"Android中文翻译组——Android中文合集(6)"包含的资料涉及了Android开发的各个方面,是学习和提升Android技能的重要资源。通过深入研究和实践这些知识点,开发者能够更好地理解和开发Android应用。

    Android消息机制

    此机制是Android应用开发中最常见的消息处理方式之一,它将消息传递的过程划分为三个主要阶段:消息循环的建立、消息的发送以及消息的处理。 #### 二、消息循环 消息循环是`Handler`机制的核心组成部分,负责接收...

Global site tag (gtag.js) - Google Analytics