Handler原理

Handler的原理是什么:

Handler封装了消息的发送(主要包括消息发送给谁sendToTarget,默认发给自己)

Looper

内部包含一个消息队列也就是MessageQueue,所有的Handler发送的消息都走向这个消息队列

Looper.Looper方法,就是一个死循环,不断的从MessageQueue取消息,如有消息就处理消息,没有消息就阻塞

MessageQueue:就是一个消息队列,可以添加消息,并处理消息

Handler也很简单,内部会跟Looper进行关联,也就是说在Handler的内部可以找到Looper,找到了Looper也就找到了MessageQueen,在Handler中发送消息,其实就是向MessageQueen队列中发送消息

总结:handler复制发送消息,Looper负责接收Handler发送的消息,并直接把消息回传给handler自己,MessageQueue就是一个存储消息的容器

Threadlocal 用于在线程当中存储一些变量信息 有set(将变量存在Threadlocal当中),get(从Threadlocal获取变量的方法)

从Handler源码当中可以看到,创建了Handler,就会自动创建一个Looper对象

从Looper的源代码中可以看到,Looper中就包含有messageQueen的成员变量,其实创建Looper的目的就是获取MessageQueen

从Handler的sendEmptyMessage的跟进源码中可以看到,handler发送消息的机制就是通过messagequeue实现的。

messagequeue的实现方法就是通过Looper.loop();方法里的一个死循环将messageQueue发送给Handler

上图是从慕课网截图的通过图解的方式理解Handler的原理

时间: 2024-11-15 15:41:31

Handler原理的相关文章

Handler原理浅析

    理解Handler的原理首先要搞清楚什么是Looper,在我的上一篇博文中对此有专门的介绍.Looper的作用是开启一个消息循环,从MessageQueue(Message队列,是Looper的成员变量)中循环取出消息处理.一个线程要使用Handler来处理来自其它线程的消息,这个线程必须有且仅有一个Looper对象与之绑定,也可以说一个Looper对象是是与一个线程一一对应的. Hander有一个Looper类型的成员,在Handler的构造函数(new Handler()或者new

异步消息处理机制-Android中Handler原理(续)

异步消息处理线程是指线程启动后会进入一个无限循环,每循环一次,从内部的消息队列里面取出一个消息,并回调相应的消息处理函数.一般在任务常驻,比如用户交互任务的情况下使用异步消息处理线程. 之前在Android中Handler原理里面研究过android里实现异步消息处理线程的方式,基本逻辑如图所示 今天就用java将其简单的模拟出来加深印象,下面的类图是用工具导出的,不太正规,不过能大概看出类之间的关系 Message类:消息类 public class Message { public int

Handler 原理分析和使用之HandlerThread

前面已经提到过Handler的原理以及Handler的三种用法.这里做一个非常简单的一个总结: Handler 是跨线程的Message处理.负责把Message推送到MessageQueue和处理. Looper 用来轮询MessageQueue,获取Message 发送给指定的Handler进行处理. Looper 需要和线程绑定,绑定那个线程,Handler就会在那个线程处理Message 前两篇文章使用Handler处理的场景是:主线程(UI线程)被子线程更新.即使用主线程的Handle

Handler 原理分析和使用(一)

我为什么写Handler,原因主要还在于它在整个 Android 应用层面非常之关键,他是线程间相互通信的主要手段.最为常用的是其他线程通过Handler向主线程发送消息,更新主线程UI. 下面是一个最简单的例子. 1 import android.os.Handler; 2 import android.os.Message; 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 imp

Android中Handler原理

Handler主要是主线程和子线程通信.一般子线程中做一些耗时操作做完之后通知主线程来修改UI. 实际上android系统在Activity启动或者状态变化等都是通过Handler机制实现的. 首先进入到ActivityThread的main方法中 public static void main(String[] args) { -- Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.

Android SwipeRefreshLayout 官方下拉刷新控件介绍—Handler原理—Adapter总结

參考博客:http://blog.csdn.net/lmj623565791/article/details/24521483 自己敲了下代码,这个方式刷新确实给人耳目一新的感觉.资源:含有两个SwipeRefreshLayout实战的Demo,http://download.csdn.net/detail/itjavawfc/8847339 用起来很好用:看看文档几个重要的方法,简单拿来用没有不论什么问题. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZX

Android Handler 原理

在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在handleMessage中 提供收到消息后相应的处理方法即可,这里不对handler使用进行详细说明,在看本博文前,读者应该先掌握handler的基本使用,我这里主要深入描述handler的内部机制 .现在我们首先就有一个问题,我们使用myThread

Handle的原理(Looper、Handler、Message三者关系)

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Handle的原理(Looper.Handler.Message三者关系) - Ansen - 博客频道 - CSDN.NET Ansen 当我们失去了青春的时候,起码我们还留下了代码...... 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &n

Android异步之Asynctask与Handler面试七问

提出问题: 1.Android中的异步处理方式? 2.如何使用Handler以及在使用过程中如何避免Handler引起的内存泄露? 3.从源码角度分析MessageQueue,Message,handler,looper,主线程,子thread之间的关系 4.Handler通过sendMessage以及post Runable对象有什么区别 5.如何给一个线程建立消息循环,即如何构建一个looper线程? 6.Asynctask中有哪些方法,分别如何使用,哪些方法在主线程执行,哪些方法在子线程执