`
cleverGump
  • 浏览: 10752 次
社区版块
存档分类
最新评论

总结一下Handler,Looper,HandlerThread,MessageQueue

阅读更多
转自:http://www.juziku.com/wiki/3880.htm


总结一下Handler,Looper,HandlerThread,MessageQueue

无论是在之前的开发中,还是在最近的面试中,handler跟loop几乎是必接触到的,而最近在面A8音乐时也被问到了handlerthread这个类,现在我就来总结一下三者之间的关系:
   首先来说handlerthread吧,因为他是我最近接触到的,刚在官方文档中看到了它的大概的概述:
  Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.翻译成中文大概是:handlerthread这个类能方便的开启一个包含looper的线程,这个looper也能被用来创建一个handler对象(意思就是把looper以参数形式传递到handler的构造器),并提示我们注意:在用到 handlerthread时,同样必须调用start方法。

Android提供了一个线程类HanderThread类,HanderThread类继承了Thread类,它封装了Looper对象,使我们不用关心Looper的开启和释放的细节问题(因为Looper的构造函数是私有的,对于其实例的获取比较麻烦,而HandlerThread帮我搞定了这些繁琐)。HandlerThread对象中可以通过getLooper方法获取一个Looper对象引用。


其主要的方法有:
 
public Looper getLooper ()
Since: API Level 1
This method returns the Looper associated with this thread. If this thread not been started or for any reason is isAlive() returns false, this method will return null. If this thread has been started, this method will block until the looper has been initialized.

public int getThreadId ()
Since: API Level 1
Returns the identifier of this thread. See Process.myTid().
public boolean quit ()
Since: API Level 5
Ask the currently running looper to quit. If the thread has not been started or has finished (that is if getLooper() returns null), then false is returned. Otherwise the looper is asked to quit and true is returned.
public void run ()
Since: API Level 1
Calls the run() method of the Runnable object the receiver holds. If no Runnable is set, does nothing.

像我之前在项目中使用handler在主线程中对UI进行重绘,其运行机制都是通过发送消息的方式,从子线程中发送消息,然后UI线程中的looper对象接收消息并管理消息队列,默认情况下系统会创建一个无参构造方法的Handler对象,利用这种方法Handler可以自动与当前运行线程(UI线程)的Looper关联,这就是为什么我之前的UI线程中创建Handler时都不需要给其构造器中传递looper对象的原因了。

Public Constructors
public Handler ()
Since: API Level 1
Default constructor associates this handler with the queue for the current thread. If there isn't one, this handler won't be able to receive messages.
public Handler (Handler.Callback callback)
Since: API Level 3
Constructor associates this handler with the queue for the current thread and takes a callback interface in which you can handle messages.
public Handler (Looper looper)
Since: API Level 1
Use the provided queue instead of the default one.
public Handler (Looper looper, Handler.Callback callback)
Since: API Level 3
Use the provided queue instead of the default one and take a callback interface in which to handle messages


通过Handler的这几个构造器就更加知道我之前用法的原因了,完全属于初级阶段,呵呵。
接受消息发送和计划任务的处理是目标线程,它是通过Looper机制维护消息队列,如果应用中有包含更新UI处理,则要把更新UI的处理代码放置在目标线程中,这个时候还要保障更新UI的线程是主线程。

handler发送消息有两种方式,一种是post,另一种是send方式,send方式的话,那么通过handleMessage处理发送过来的消息;Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。

接下来我们再来说说Looper,它是用了收发消息并管理消息队列的,它的构造器是私有的,它的实例化需要通过 loop.prepare()即初始化当前线程为looper,为什么说looper是用来管理消息队列的,因为通过源码发现:
MessageQueue是在Looper的私有构造函数Looper()中实例化的;
总结一下,HandlerThread是被显式地通过new创建的实例,而与它绑定在一起的Looper是在HandlerThread的执行过程中被实例化的,相应的MessageQueue也是在这个过程中实例化的。
  然后之前我也从不少地方,无论是视频还是论坛里得到的结论是:looper.loop实际上就是一个while(true)的死循环,MessageQueue是Looper保留的一份引用,通过它的next()[序列1]获取MessageQueue中的下一个要处理的消息,这个过程中如果没有相应的消息,执行它的线程会用this.wait()释放它所拥有的MessageQueue的对象锁而等待。
分享到:
评论

相关推荐

    Looper、Handler与HandlerThread

    1. **Looper**:Looper是一个消息循环器,它负责从消息队列(Message Queue)中取出消息(Message),然后分发到对应的Handler进行处理。在Android系统中,每个线程都有一个Looper对象,但默认情况下只有主线程(UI...

    了解Android核心:Looper,Handler和HandlerThread

    为了管理这些任务,Android引入了Looper、Handler和MessageQueue。MessageQueue是一个先进先出(FIFO)的队列,用于存储待处理的消息或任务。Handler则充当消息的生产者和消费者,它将消息放入MessageQueue,并在...

    Thread、Handler和HandlerThread关系详解

    ,这个题目有点意思,对于很多人来说,可能对Thread和Handler很熟悉,主要涉及到Android的消息机制(Handler、Message、Looper、MessageQueue),详见《 从Handler.post(Runnable r)再一次梳理Android的消息机制(以及...

    深入Android Handler,MessageQueue与Looper关系

    关联篇:HandlerThread 使用及其源码完全解析 关联篇:Handler内存泄漏详解及其解决方案 一说到Android的消息机制,自然就会联想到Handler,我们知道Handler是Android消息机制的上层接口,因此我们在开发过程中也只...

    Android handler message奇怪用法详解

    7. **MessageQueue插队**:`MessageQueue.next()`方法允许开发者获取并立即处理下一个消息,跳过其他等待的消息,但这需要谨慎使用,因为它可能破坏消息的正常顺序。 8. **Message的target属性**:除了Handler外,...

    android多线程handler/message机制详解

    Looper 负责从其内部的 MessageQueue 中拿出一个个的 Message 给 Handler 进行处理。 Message 是什么?Message 是后台进程返回的数据,里面可以存储 Bundle 等数据格式。MessageQueue 是线程对应 Looper 的一部分,...

    Looper物件之角色(Demo 1)

    《Looper对象的角色与应用解析》 在Android系统中,Looper对象扮演着至关重要的角色,它是消息处理机制的...开发者在实际工作中应合理利用Looper、MessageQueue和Handler三者之间的协作关系,确保应用的高效和稳定。

    handlerthread学习demo

    `HandlerThread` 的工作原理与普通的线程有所不同,它结合了`Handler`、`Looper` 和 `MessageQueue`,使得开发者可以在单独的线程中处理消息,避免阻塞主线程,提高应用程序的响应速度。 描述中的"handlerthread做...

    handler机制

    需要注意的是,Handler、Looper和MessageQueue都是与线程绑定的,因此在不同线程中创建的Handler无法直接互相通信。如果需要在不同线程间传递消息,可以使用`HandlerThread`,这是一个具备Looper的线程类,可以方便...

    王栋栋_周报关于android异步消息处理机制handler_20190524.doc

    当Looper不断从MessageQueue中取出消息时,会将消息传递给对应的Handler进行处理。 #### 三、Handler的基本使用 **1. 创建Handler** ```java // 创建Handler Handler handler = new Handler(){ @Override ...

    android HandlerThread 实例

    `Looper` 是 Android 中用于消息处理的核心类,它维护了一个消息队列(MessageQueue)并负责不断地从队列中取出消息并分发给相应的`Handler`进行处理。因此,`HandlerThread` 可以看作是一个拥有自己消息循环的线程...

    Handler机制

    为了解决这个问题,Android引入了Handler、Looper、Message和MessageQueue等概念,构建了一套高效的消息传递和处理机制。 1. **Handler**:Handler是消息处理的核心,主要用于发送和接收消息。它与一个Looper对象...

    android Handler的使用(二)

    本篇文章将深入探讨`Handler`的工作原理及其在实际应用中的使用方式,特别是通过`Looper`、`Message`和`MessageQueue`的协同工作来实现线程间通信。 一、`Handler`基础 `Handler`主要负责发送和处理`Message`或`...

    HandlerThread使用demo

    它是基于Thread的,但提供了MessageQueue和Looper的集成,使得我们能够在子线程中方便地通过Handler来发送和处理消息。理解并熟练使用HandlerThread,能够帮助开发者更好地进行多线程操作,避免直接在主线程执行耗时...

    android中的Handler(2)

    在Android系统中,`Handler`、`Looper`和`MessageQueue`构成了一个消息处理机制,它们是Android异步编程的核心组件。这篇博客“android中的Handler(2)”可能深入探讨了`Handler`的使用和原理,尽管具体内容无法...

    子线程和主线程通过handler 双向通信

    主线程默认拥有一个Looper对象,它是一个消息循环,负责不断检查Message Queue(消息队列)并分发消息。当我们在主线程中创建一个Handler时,这个Handler会关联到主线程的Looper。我们可以通过Handler的post()或...

    详细分析android的MessageQueue.IdleHandler

    我们知道android是基于Looper消息循环的系统,我们通过Handler向Looper包含的MessageQueue投递Message, 不过我们常见的用法是这样吧? 一般我们比较少接触MessageQueue, 其实它内部的IdleHandler接口有很多有趣的...

    安卓api中文总结.pdf

    总结,`HandlerThread`提供了线程级别的消息处理机制,而`MessageQueue`是消息传递的核心组件,两者协同工作,确保了Android应用程序中异步任务和UI更新的有序执行。在实际开发中,合理使用`HandlerThread`和`...

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

    Handler的主要作用是发送并处理Message或Runnable对象,它通过与Looper和MessageQueue配合工作,实现消息的调度和处理。在主线程中,每个应用程序都有一个默认的Looper,用于不断从MessageQueue中取出Message进行...

Global site tag (gtag.js) - Google Analytics