`
Poechant
  • 浏览: 227352 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24231
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22027
社区版块
存档分类
最新评论

Android开发之道(10)Handler本质简析与使用实例

 
阅读更多

Android 开发之道(10)Handler本质简析与使用实例

  • 作者:柳大·Poechant
  • 邮箱:zhongchao.ustc@gmail.com
  • 博客:blog.csnd.net/poechang
  • 日期:March 19th, 2012

1 Overview

先浅析本质太过抽象,还是先上 Handler 的最简实例吧。

  • 功能:Android.os.Handler负责接收,并按计划发送和处理消息;
  • 特点:处理消息是阻塞式的;
  • 本质:关于Handler的内部机制,及其与Looper的关系,请看本文的第三部分“消息处理机制的本质”。

2 Get Started

2.1 先创建一个 Handler 对象,

private Handler mHandler = new Handler();

但这样的Handler是没用的。不过先暂且不要管,往下面看。

2.2 向 Handler 的消息队列发送数据

发送数据的动作是通过 sendMessage 完成的。

Message message = new Message();  
message.what = 1;

// 将消息发送到mHandler的消息队列的最后
mHandler.sendMessage(message);

不过实际上,在 Handler 内部有一个 Looper 类,而消息队列其实是 Looper 的一个成员。Handler 中的 mQueue 就是其成员 mLooper 的 mQueue。

2.3 处理消息队列中的数据

Handler 可以根据 Message 中的 what 值的不同来分发处理,Handler 中提供了 handleMessage 来让开发人员进行 Override。示例如下:

public void handleMessage(Message msg) {
    switch (msg.what) {
    case 1:
        // 所做的操作
        break;
    case 2:
        // 所做的操作
        break;
    default:
        // 所做的操作
    }
};

完整的写法,就是在创建 Handler 对象时如下:

private Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case 1:
            // 所做的操作
            break;
        case 2:
            // 所做的操作
            break;
        default:
            // 所做的操作
        }
    };  
}

2 计时器简例

2.1 先创建一个任务类

Timer 和 TimerTask 是 Java 语言中的类,如果不熟悉,请看下面的例子及注视。

// 任务类
private class MyTask extends TimerTask{
    @Override
    public void run() { 
        // 创建要发送的消息
        Message message = new Message();  
        message.what = 1;

        // 将消息发送到mHandler的消息队列的最后
        mHandler.sendMessage(message);
    }     
}

使用方法很简单,就是用 Timer 来作为容器:

// 创建用于执行任务类的Timer
Timer timer = new Timer();

// 1毫秒之后开始每隔5秒钟执行一次MyTast
timer.scheduleAtFixedRate(new MyTask(), 1, 1000);  

2.2 完整的例子

布局文件就省略了,源码如下:

package com.sinosuperman.android;

import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class Test extends Activity {

    //title为setTitle方法提供变量,这里为了方便我设置成了int型  
    private int mSecs = 0;  

    private Handler mHandler = new Handler(){
        // 根据mHandler的消息队列中的不同消息进行处理
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
                // 所做的操作
                updateTitle();  
                break;  
            }  
        };
    };

    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);

        // 创建用于执行任务类的Timer
        Timer timer = new Timer();

        // 1毫秒之后开始每隔5秒钟执行一次MyTast
        timer.scheduleAtFixedRate(new MyTask(), 1, 1000);  
    }

    // 任务类
    private class MyTask extends TimerTask{
        @Override
        public void run() {

            // 创建要发送的消息
            Message message = new Message();  
            message.what = 1;

            // 将消息发送到mHandler的消息队列的最后
            mHandler.sendMessage(message);
        }     
    }

    // 处理消息所做的操作
    public void updateTitle(){
        setTitle("Michael's Timer: " + mSecs);  
        mSecs++;  
    }  
}

3 消息处理机制的本质

3.1 Looper 与 Handler 的内部机制

Looper 中有一个 MessageQueue 的成员,Looper 中还有有一个 loop 函数用来对消息队列进行循环。Looper 并不直接与 Handler 绑定,我们可以直接“玩弄” Looper,不过 Handler 让我们“玩弄”她更容易一些。

Handler 本质上是一个工具类,其内部有 Looper 成员。我们通过 Handler 类完成消息的发送和处理、制定分发机制等等。

3.2 消息处理机制的本质

Handler 中封装了 Looper 成员,Handler 中的消息队列就是 Looper 中的消息队列成员。Looper 中有消息的循环分发机制。下面介绍下内部的大致流程:

  1. 当将一个消息通过 sendMessage 交给 Handler 的时候,就是交给了 Looper;
  2. Looper 将消息发送到这个消息指定的 target,而这个“指定”的动作是在 Handler 内部完成的,就是指定为 Handler 自己。
  3. Looper 将这个消息发送给 target 的 dispatchMessage 函数处理,因为 Handler 指定了 target 是自己,所以就是 Handler 的dispatchMessage 函数。
  4. dispatchMessage 函数对该消息进行处理的时候,调用的是 handleMessage,就是由我们自己 override 的那个函数。

Reference

  1. http://weizhulin.blog.51cto.com/1556324/323922
  2. http://blog.csdn.net/Innost/article/details/6055793

-

转载请注明来自“柳大·Poechant的CSDN博客”:blog.CSDN.net/Poechant

-

分享到:
评论

相关推荐

    android handler runnable使用实例(关键是内部run中停止)

    在Android应用开发中,Handler、Runnable和Looper是三个非常重要的组件,它们构成了Android的消息处理机制。这个机制使得UI线程可以非阻塞地处理来自其他线程的消息,从而避免了UI冻结,提升了用户体验。下面我们将...

    【Android开发入门】Android线程之Handler

    Handler是Android中处理消息和调度任务的对象,它通常与Looper和Message配合使用,实现线程间的通信。主线程中默认有一个Looper对象,负责接收和分发Message,而Handler则用来发送Message到Looper,从而实现主线程的...

    android 实例 Activity 之间通过 Handler 通信

    在Android应用开发中,Activity是用户界面的主要载体,它们经常需要相互交互以实现复杂的业务逻辑。Handler作为一种消息处理机制,常被用来在不同的线程间(包括Activity之间)进行通信。本实例将深入探讨如何利用...

    Android中Handler与Message的简单实例

    Android中Handler与Message的简单实例 前言: 虽然笔者已经学习了Android的AsyncTask来实现一部消息的处理。但是在android的学习中,经常会在一些demo中看到Handler与Message的一些使用,所以Handler与Message的学习...

    Android开发工程师面试题之handler详解。android程序员,android开发面试资料,详解

    ### Android开发工程师面试题之Handler详解 在Android开发过程中,Handler是进行线程间通信的重要机制之一,尤其在实现异步任务更新UI等场景中扮演着关键角色。本篇文章将围绕Handler的工作原理、核心组件及其实现...

    android handler和线程的简单实例

    在Android开发中,`Handler`、`Message`和线程是三个非常重要的概念,它们用于在应用程序的不同组件之间实现异步通信和数据传递。本文将深入讲解这些概念,并通过一个简单的实例来帮助初学者理解其工作原理。 首先...

    android Handler详细使用方法实例

    Android中的Handler机制是Android应用开发中的核心组件之一,它与多线程、消息队列紧密相连,用于实现线程间的通信和任务的调度。Handler允许您将任务发送到特定的线程的队列中执行。一个典型的使用场景是在非UI线程...

    Android的日期类及Handler的使用

    在Android开发中,处理日期和时间以及实现UI的异步更新是常见的任务。本文将深入探讨Android中的日期类以及Handler的使用,这两个概念在实际应用中有着广泛的应用。 首先,让我们了解一下Android中的日期类。在Java...

    Android开发10个实例源码

    "Android开发10个实例源码"集合提供了一系列实用的项目源代码,帮助开发者深入理解Android应用的构建过程,同时也为学习新功能和优化技巧提供了丰富的资源。下面我们将详细探讨这些实例可能涵盖的知识点。 1. **...

    最详细的Android开发教程实例

    10. **通知与消息推送**:讨论如何使用Notification API向用户发送系统通知,以及实现远程消息推送(如Firebase Cloud Messaging)。 11. **权限管理**:讲解Android的权限模型,如何在`AndroidManifest.xml`中声明...

    android handler例子

    在Android开发中,`Handler`是一个至关重要的组件,它用于处理与线程通信相关的任务,尤其是在主线程(UI线程)和工作线程之间。`Handler`、`Looper`和`Message`三者共同构成了Android的消息传递机制。下面将详细...

    Android 应用开发实例

    实例可能讲解AsyncTask、Handler、Thread或ExecutorService的使用,以及如何避免应用因ANR(应用无响应)问题而崩溃。 六、通知与服务 Android的通知系统允许应用在状态栏显示消息,而服务则可以长时间在后台运行。...

    Android Handler机制实例

    在Android应用开发中,Handler是实现线程间通信的关键组件,尤其在处理UI更新和异步任务时。本文将深入探讨Android Handler机制的实例,帮助初学者理解并掌握这一核心概念。 首先,我们要理解Android应用的基本运行...

    android demo,使用Handler的postDelay,Runnable run实现延时3秒的splash。

    在Android开发中,Splash Screen(启动屏)是应用程序启动时展示的一个短暂页面,通常用于加载应用数据或展示品牌标识。本示例中的“android demo”就是关于如何利用Handler的`postDelayed`方法和`Runnable`接口来...

    Android中handler的使用

    在Android开发中,Handler是处理多线程通信的关键机制,尤其在UI更新和异步任务中扮演着重要角色。本文将深入探讨Handler的工作原理、如何使用以及它在处理多线程中的应用。 Handler的主要功能是发送和处理消息,它...

    Android_Handler详解(一)

    在Android开发中,Handler是一个至关重要的组件,它与线程、消息队列和Looper紧密关联,用于实现不同线程间的通信。本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的作用。 1. Handler是什么? ...

    Fragment与Activity使用Handler进行交互

    通过创建一个Handler实例并与Looper(消息循环)关联,我们可以发送和处理Message,从而实现在不同线程间的数据传递和回调。 在Fragment和Activity之间使用Handler,通常涉及以下步骤: 1. **创建Handler实例**:...

    android-Handler的使用

    【Android Handler 使用详解】 Handler 是 Android 平台中用于处理线程间通信的关键组件,尤其在涉及 UI(用户界面)更新时,它扮演着至关...正确理解和使用 Handler,对于开发高效且稳定的 Android 应用至关重要。

    Handler多线程处理简单实例

    本实例将深入探讨`Handler`如何与多线程协同工作,帮助开发者更好地理解和运用。 `Handler`类在Android中扮演着消息传递的角色,它主要负责在不同的线程之间发送和处理消息。通常,主线程(UI线程)用于处理用户...

    初中级Android开发社招面试之Handler.zip

    在Android应用开发中,Handler是实现线程间通信的关键组件,尤其对于处理UI更新和异步任务至关重要。本文将深入探讨Handler的相关知识点,为初中级Android开发者提供面试准备指南。 1. **Handler基础** Handler的...

Global site tag (gtag.js) - Google Analytics