`

Handler部分原理

阅读更多
1. 首先大家需要知道,android对java core library中的众多class都作了修改,包括Thread, 所以android中的java.lang.Thread并非和java SE中的java.lang.Thread一模一样。还有其他众多的基础类也都有修改。
2. 关于时间的模型,参考android.os.SystemClock类的api,有三种模型:System.currentTimeMillis(),uptimeMillis()和elapsedRealtime()。我们这里要关心的是uptimeMillis()。
3. Looper类,Looper的作用是将一个普通线程转变为一个“不停地处理消息的线程”,一旦在某个线程的run()方法中启动了Looper.prepare()和Looper.loop(),那么这个线程就会有一个MessageQueue(在Looper构造函数中创建,关联在该Looper instance上)。其他线程或者该线程本身可以通过某个Handler往该MessageQueue中发送消息,而Looper在loop()循环中会不停地去取出消息,执行消息(如何执行见下面Handler中的描述)。参见Looper类api以了解更多内容。
4. MessageQueue:表面上该类是一个先进先出的队列,但其背后实现其实是一个linked list.该类有一个enqueueMessage()方法,用于将消息塞入队列中。每个Message对象上有一个when域,是个绝对时间(uptimeMillis度量模型),表明该消息何时应该真正“被递送".塞入队列的消息根据when的大小排序串起来,排在前面的when的时间小。当Looper每次从queue中取出消息对象的时候,会用当前时间和队列头上的消息的when比较,如果when<=当前时间了则被取出,否则消息继续悬挂在队列中等待"被递送"。Handler.postDelayed()或sendMessageDelayed()相关方法底下则是直接调用了MessageQueue的enqueueMessage(),将消息直接悬挂入队列中。
5. Message: 该对象表示塞入queue的消息。该对象上有一些重要的域:arg1,arg2,obj,setData()这些是消息所携带的数据;when表示该消息何时应该被递送(前面已有解说);target表示该消息该由哪个handler对象来处理,通过handler来发送消息的时候handler都会在发送方法中把这个域给置上(置成自己);callback表示该Message是否包装了一个Runnable对象,用handler.post()相关方法发送一个Runnable的时候其实底下还是发送了一个Message对象,该对象的callback设成了该Runnable instance; next域,用来将塞入MessageQueue的各个消息串起来,在MessageQueue中被使用。what代表该消息的code,即具体是什么类型的消息,每个what都在其handler的namespace中,因此不用担心一个handler中定义的what和另一个handler中定义的what有冲突,你只要保证一个handler instance处理的所有消息的what没有冲突即可。when,data,target,callback,next这些域都是package可见的,在相关的其他类中被使用,或者通过getter,setter方法被暴露。
6. Handler:一个handler instance被new出来的时候,会自动关联到该线程的Looper对象上,也就关联到了该Looper的MessageQueue上。发送任何消息都需要通过handler类。handler的众多方法都是线程安全的,因此假如我们在主线程中创建了一个handler instance,你可以把该handler传递给某个其他线程。其他线程利用该handler instance的post或send方法发送消息给该handler关联的message queue,也就是主线程的message queue, 主线程的Looper然后取出这些消息,拿出Message.target, 然后调用target上的dispatchMessage()方法,也就是Handler.dispatchMessage(). 该方法中如果发现该Message包装了一个Runnable,就直接调用该Runnable的run()方法;如果不是,如果该handler上挂了一个Handler.Callback对象,则调用他的handleMessage(), 否则则调用handler自己的handleMessage().注意这三类处理都是在主线程中所做。具体可参见Handler类源码。
7. 每个android的程序一启动便会有一个主线程(UI线程),该线程负责显示用户界面,管理各个component(activity, receiver等),处理用户界面上的各类消息等。该线程一启动内部便已经初始化了一个Looper,因此主线程已经有了一个MessageQueue。在Activity的onCreate方法中可以直接new Handler(),便会直接挂到该主线程的Looper上。
8. android.os.HandlerThread: 为了方便把一个普通线程变成一个有Looper和MessageQueue的线程,便对Thread类进行了包装,产生了此类。在onLooperPrepared()方法中你可以new出handler instance, 挂到该线程的Looper上。或者你先启动该HandlerThread,然后拿到他上面的Looper,把该Looper作为参数调用new Handler(Looper)构造函数,也可以实现handler和该thread上message queue的绑定。这个类只是为了方便实现Looper和message queue这种模式而以。

其他可参考的文章:
http://codinghard.wordpress.com/2009/05/16/android-thread-messaging/
http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/

分享到:
评论

相关推荐

    Android Handler机制的工作原理详析

    Handler机制的工作原理可以分为以下几个部分:Looper、MessageQueue、Handler和Message。 首先,Looper是Handler机制的核心组件,它负责创建MessageQueue和线程之间的通信。Looper的初始化需要调用prepare()方法,...

    Handler使用

    `Handler`是Android消息处理机制的核心部分,它与`Looper`和`Message`共同协作,实现了线程间的消息传递。`Handler`通常在主线程(UI线程)中创建,用于接收并处理来自其他线程的消息。 ### 2. Handler工作原理 - ...

    handler用法

    Handler的工作原理主要包括三部分:Handler对象、Message和Looper。Looper是消息循环器,它在一个线程中不断检查Message Queue(消息队列),一旦发现有新的Message,就会将其取出并交给Handler处理。Handler则负责...

    自己设计的Android简易版本Handler 框架及实现源码,对了解Android Handler原理有一定的参考价值

    自定义`Handler`的核心部分包括以下几个步骤: 1. **创建Looper**:如果在非主线程中使用`Handler`,需要手动创建并启动`Looper`。 2. **定义Handler子类**:继承自`Handler`,重写`handleMessage(Message msg)`...

    Handler 推荐用法 demo

    `Handler`的基本原理是基于消息队列(Message Queue)和Looper的机制。它由三部分组成:`Handler`对象、`Looper`和`Message`。当在工作线程中创建一个`Handler`实例时,这个`Handler`会自动关联到当前线程的`Looper`...

    Handler的简单使用

    本篇文章将详细介绍`Handler`的基本概念、工作原理以及如何在一个`Activity`中简单使用它来实现动画效果。 `Handler`的核心功能是发送和处理消息。在Android系统中,主线程负责处理用户交互,如显示界面、更新UI等...

    Android_Handler消息处理机制

    这个机制允许Android应用程序在不同的线程间传递消息,处理UI更新等操作,是多线程编程中的重要组成部分。下面我们将深入探讨这个机制的工作原理和应用。 首先,我们从Handler开始。Handler在Android中扮演着消息的...

    androidHandler测试的demo

    4. 源代码分析:可能包含对Android系统源码中`Handler`、`Looper`相关部分的注释和解释,帮助理解它们的工作原理。 5. 测试用例:可能有针对`Handler`功能的测试代码,验证不同线程间的通信是否正常,消息处理是否...

    Handler耗时操作

    下面将详细介绍`Handler`的运作原理及其在处理耗时操作中的应用。 1. **Handler的基本概念**:`Handler`是一个对象,它可以发送并处理`Message`或`Runnable`对象。通常在主线程(UI线程)中创建`Handler`,这样它就...

    Android源代码:HandlerDemo

    在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI...`HandlerDemo`项目提供了一个实践和学习`Handler`机制的良好平台,通过实际操作,可以更深入地理解其工作原理。

    Android中的Handler的具体用法

    `Handler`机制是Android系统为了实现线程间通信而设计的一种模式,主要包含三部分:`Handler`、`Message`和`Looper`。`Handler`是消息的处理器,`Message`用于承载数据,而`Looper`则负责消息的循环读取和分发。 1....

    handler图片切换

    下面将详细阐述Handler的工作原理以及如何将其应用于图片切换场景。 Handler是Android系统提供的一个消息处理类,它主要用于解决Android应用中的多线程问题。Android UI操作必须在主线程中执行,而大部分网络请求、...

    进度条对话框:通过Handler实现

    它的工作原理基于Message队列,允许我们在后台线程中发送消息,然后由主线程中的Handler对象来处理这些消息,执行UI更新。 2. **创建ProgressDialog**:在Android应用中,我们首先需要创建一个ProgressDialog实例,...

    Android Thread Handler

    Handler的工作原理主要涉及以下三个部分: 1. **Message**:这是Handler通信的基本单元,包含了要传递的数据和消息类型。通过`obtainMessage()`方法可以创建Message,并用`arg1`, `arg2`, `obj`等参数传递数据。 2...

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

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

    handler线程

    Handler机制是Android系统中用于处理消息和线程通信的重要组成部分。它主要由四个核心组件组成:`Looper`、`Handler`、`MessageQueue` 和 `Thread`。 #### 二、核心组件解析 1. **Looper** - **定义**:`Looper`...

    uncleShi#AndroidFace#Android部分-5 Handler1

    1.子线程一定不能更新UI吗 2.给我说说Handler的原理 3.Handler导致的内存泄露你是如何解决的 4.如何使用Handler让子线程和子线程通信

    handler消息机制详细教程

    根据给定文件的标题“handler消息机制详细教程”,我们可以得知此教程旨在深入解析Handler的工作原理及其在Android应用开发中的应用。 - **定义与作用**:Handler作为Android提供的机制之一,主要负责线程之间的...

    EPSON NS 6040 Manual---- IC Handler

    这部分内容对于用户来说至关重要,因为它帮助用户理解和掌握处理器的基本构造与操作原理。 第3章阐述了处理器的转移和安装过程,包括处理器安装过程中的注意事项和安全措施,同时解释了处理器与外部设备的连接方式...

    Android review handler的使用

    `Handler`的工作原理如下: 1. **创建Handler实例**:通常在主线程中创建`Handler`对象,并重写`handleMessage(Message msg)`方法,这个方法会在主线程中执行,用于处理来自其他线程的消息。 2. **定义Message**:...

Global site tag (gtag.js) - Google Analytics