Handler本质简析与使用实例

转载 2012年03月28日 13:37:10

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

-

From : http://blog.csdn.net/poechant/article/details/7371461

Handler本质简析与使用实例

1 Overview 先浅析本质太过抽象,还是先上 Handler 的最简实例吧。 功能:Android.os.Handler负责接收,并按计划发送和处理消息; 特点:处理消息是阻塞...
  • Guyuebingchuan
  • Guyuebingchuan
  • 2014年02月21日 16:58
  • 385

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

Android 开发之道(10)Handler本质简析与使用实例作者:柳大·Poechant邮箱:zhongchao.ustc@gmail.com博客:blog.csnd.net/poechang日期...
  • Poechant
  • Poechant
  • 2012年03月20日 00:18
  • 8233

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

Android 开发之道(10)Handler本质简析与使用实例 作者:柳大·Poechant邮箱:zhongchao.ustc@gmail.com博客:blog.csnd.net/poecha...
  • zhangxu365
  • zhangxu365
  • 2012年03月20日 20:29
  • 411

Android中Handler使用实例

本文通过“使用新线程计算质数”这样一个demo,简单讲解如何在Android中使用Handler进行多线程开发。 为了更好地理解Handler的工作原理,先介绍一下Handler一起工作的几个组件。...
  • jasper_success
  • jasper_success
  • 2016年02月16日 16:37
  • 1923

Android多线程及异步任务消息处理机制(一)--Handler的使用

转载请注明出处: 前言         我们知道,不管在任何的语言或操作系统平台(Android系统也不例外),多线程、多进程和异步任务的相关技术地讨论都是永恒的话题,很多的开发需...
  • yegongheng
  • yegongheng
  • 2014年08月26日 12:39
  • 3157

Android中handler的用法实例

Android中handler的用法实例 Handler主要用于不同线程之间的通信,尤其是普通线程通过handler机制发送message给主线程(UI线程)来更新UI,或者是把耗时的操作发送给ser...
  • zero9988
  • zero9988
  • 2015年12月04日 20:07
  • 1751

Android Handler 四个使用实例 及HandlerThread的使用

当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说:点击一个Button,Android会分发事件到Button上,来响应你的...
  • a78270528
  • a78270528
  • 2015年09月06日 17:49
  • 2274

Android handler(工具类)弱引用 WeakReference

转载:(http://blog.csdn.net/android_zhengyongbo/article/details/70046398) handler弱引用可以在一定程度上防止内存泄露hand...
  • android_zhengyongbo
  • android_zhengyongbo
  • 2017年04月11日 09:58
  • 1164

Android Handler简单例子

package com.example.handler; import android.os.Bundle; import android.app.Activity; import android....
  • flyfight88
  • flyfight88
  • 2013年02月21日 14:22
  • 3085

Handler弱引用举例(ViewPager的自动播放)

前提该代码在HomeFragment中完成: private int page = 0; //Handler的弱引用 private static class MyHandler ext...
  • iblade
  • iblade
  • 2016年03月28日 15:57
  • 834
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Handler本质简析与使用实例
举报原因:
原因补充:

(最多只允许输入30个字)