文档章节

Handler的理解

新年
 新年
发布于 2015/02/15 10:35
字数 388
阅读 9
收藏 0
点赞 0
评论 0



******************************************************************************************************

public class Handler{
    //构造方法的作用
    //1.拿到Looper
    //2.拿到Looper中的MessageQueue
    public  Handler(){
        mLooper = Looper.myLooper();
        mQueue = mLooper.mQueue;
        //mCallback  =  null;
    }

    //发送消息sendMessage最终调用的方法
    //1.将要发送的Message的target设置为this
    //2.将要发送的Message传递给Looper中的MessageQueue的方法enqueueMessage()
    public boolean sendMessageAtTime(Message msg, long uptimeMillis){
        boolean sent = false;
        if(mQueue !=  null){
            msg.target = this;
            sent = mQueue.enqueueMessage(msg, uptimeMillis);
        }
        return sent;
    }
}

********************************************************************************************

public class Looper{
    // sThreadLocal.get() will return null unless you've called prepare().
    static final ThreadLocal<Looper> sThreadLocal =
        new ThreadLocal<Looper>();

    private static Looper sMainLooper;  // guarded by Looper.class

    final MessageQueue mQueue;
    final Thread mThread;
    volatile boolean mRun;

    private static void prepare(boolean quitAllowed) {
        sThreadLocal.set(new Looper(quitAllowed));
    }

    //从线程局部变量中拿出Looper
    public static Looper myLooper() {            
        return sThreadLocal.get();
    }
    //从线程局部变量中拿出Looper
    public static void prepareMainLooper() {
        prepare(false);
        synchronized (Looper.class) {
            sMainLooper = sThreadLocal.get();
        }
    }

    public static void loop() {
// sThreadLocal.get();拿出线程局部变量的Looper
        final Looper me = myLooper();        
//拿到消息队列
        final MessageQueue queue = me.mQueue;    

        // Make sure the identity of this thread is that of the local process,
        // and keep track of what that identity token actually is.
        Binder.clearCallingIdentity();
        final long ident = Binder.clearCallingIdentity();

        //循环从消息队列中拿消息,
        for (;;) {
            Message msg = queue.next(); // might block//可能阻塞的方法
            if (msg == null) {
                // No message indicates that the message queue is quitting.
                return;
            }

            msg.target.dispatchMessage(msg);        //调用Handler的发送消息
            msg.recycle();        //消息回收
        }
    }
}

******************************************************************************
public class MessageQueue {
    // True if the message queue can be quit.
    private final boolean mQuitAllowed;

    @SuppressWarnings("unused")
    private int mPtr; // used by native code

    Message mMessages;
    private final ArrayList<IdleHandler> mIdleHandlers = new ArrayList<IdleHandler>();
    private IdleHandler[] mPendingIdleHandlers;
    private boolean mQuiting;

    // Indicates whether next() is blocked waiting in pollOnce() with a non-zero timeout.
    private boolean mBlocked;

    // The next barrier token.
    // Barriers are indicated by messages with a null target whose arg1 field carries the token.
    private int mNextBarrierToken;

    private native void nativeInit();
    private native void nativeDestroy();
    private native void nativePollOnce(int ptr, int timeoutMillis);
    private native void nativeWake(int ptr);
}

© 著作权归作者所有

共有 人打赏支持
新年
粉丝 7
博文 83
码字总数 45935
作品 0
海淀
程序员
Jetty源码学习4-基本架构与工作原理

引言 Jetty相较于Tomcat更加轻便,虽然架构更加简单,但是看起来可并不轻松。Spring是设计初衷是用来管理应用中的实例Bean,因而是基于Bean的架构;Jetty则更倾向于流程和组件的管理,采用了...

项籍20130121
2013/02/27
0
0
二. 学习Netty之ChannelHandlerContext

ChannelHandlerContext可以确保一个ChannelHandler和它的pipeline和其他的handler联系起来 handler可以通知pipeline里的下一个handler handler可以动态的修改它的pipeline在运行时 通知: 修改...

plugin
2015/10/31
0
0
typedef与char (*(*x())[5])()

原文链接:http://mikelee.blog.51cto.com/1980033/372423 typedef声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的。对于char ((x())[5])(); 我们可利用typedef来简化。 先定...

bigfish__
2012/04/05
0
0
异步任务的理解

异步任务的理解 逻辑上:以多线程的方式完成的功能需求 API上:指AsyncTask类 AsyncTask的理解: 在没有AsyncTask之前,我们用Handler+Thread就可以实现异步任务的功能需求 AsyncTask是对Han...

yabushan
2016/04/02
17
0
Android异步消息处理机制完全解析-Handler详解

参考资料 - 官方介绍文档 - Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 - Android异步消息处理机制完全解析,带你从源码的角度彻底理解 - 慕课网课程-Androi...

javen205
2017/03/25
0
0
Android中Handler、MessageQueue、Looper三者的关系然后手写一套自己的Handler

Handler、Looper、MessgaeQueue三者的分工: handler 负责发送消息 Looper 负责轮询MessageQueue中的消息,并把消息回传给handler MessageQueue 负责存储消息(先进先出) Handler、Looper、...

a_zhon
01/13
0
0
MessageContext和传输头

本节深入分析JWS服务层怎样和传输层进行交互,重点就在Handler中访问的MessageContext类型:其中子类SOAPMessageContext和LogicalMessageContext是两个参数类型,比如在SOAP Handler和Logic...

柳哥
2014/05/16
0
0
Golang Http Server源码阅读

这篇文章出现的理由是业务上需要创建一个Web Server。创建web是所有语言出现必须实现的功能之一了。在nginx+fastcgi+php广为使用的今天,这里我们不妨使用Go来进行web服务器的搭建。 前言 使...

王二狗子11
01/08
0
0
Android 面试题之线程间通信机制

为什么一定要在主线程中创建AsyncTask的对象呢? 深入理解AsyncTask 为什么一定要在主线程中创建AsyncTask的对象呢? 1.第一次加载的 AsyncTask 这个类的时候会创建 InternalHandler() 这个对...

侯蛋蛋_
01/04
0
0
10分钟了解Android的Handler机制

Handler机制是Android中相当经典的异步消息机制,在Android发展的历史长河中扮演着很重要的角色,无论是我们直接面对的应用层还是FrameWork层,使用的场景还是相当的多。分析源码一探究竟。从...

codeGoogle
05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python解析配置文件模块:ConfigPhaser

import configparser as pa# [SectionA]# a = aa# b = bb# c = cc# [SectionB]# optionint = 1# optionfloat = 1.1# optionstring = string#https://www.cnblogs.com/a......

易野
3分钟前
0
0
Java基础——面向对象

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Object的方法: clone() Object 克隆 to Strin...

凯哥学堂
4分钟前
0
0
rabbitmq学习记录(八)消息发布确认机制

RabbitMQ服务器崩了导致的消息数据丢失,已经持久化的消息数据我们可以通过消息持久化来预防。但是,如果消息从生产者发送到vhosts过程中出现了问题,持久化消息数据的方案就无效了。 Rabbit...

人觉非常君
9分钟前
0
0
毕业5年,我是怎么成为年薪30W的运维工程师

#转载# 我在大学读的是计算机专业,但大学毕业之后,进入到一家私企进行工作,工作的内容类似于网管,会经常的去修电脑,去做水晶头等内容。刚开始工作,也没想太多,最想的是丰富自己的工作...

Py爱好
16分钟前
0
0
大数据基础知识,大数据学习,涉及的知识点

一、什么是大数据 一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流 转、多样的数据类型和价值密度低四大特征。...

董黎明
31分钟前
0
0
Linux CentOS 7上安装极点五笔

话说几天前在新买的惠普笔记本上成功地安装了Linux CentOS 7操作系统、Nvidia Quandro P600驱动程序及X Window,并在VMware下安装Red Hat教学环境,彻底跳出Windows的苦海,但仍然有一件事不...

大别阿郎
44分钟前
10
0
2018年7月20日集群课程

一、集群介绍 集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。 ...

人在艹木中
46分钟前
0
0
spark开发机中调试snappy

目的 在Idea中的点击运行,使spark可以直接读取snappy 自己编译hadoop,以支持snappy的压缩。 自己编译的目的就是要得到支持snappy文件读写的动态链接库。如果可以在网上下载,可以跳过自行编...

benny周
今天
0
0
centos7 安装docker

1,查看系统版本 cat /etc/redhat-release 2,安装gcc yum -y install gccyum -y install gcc-c++ 3,卸载旧版本 yum remove docker \ docker-client \ ......

暗中观察
今天
0
0
[译]为什么(要使用)GNU Affero GPL?

#为什么(要使用)GNU Affero GPL? 作者信息:Copyright © 2010, 2013, 2014, 2015 Free Software Foundation, Inc. This page is licensed under a Creative Commons Attribution-NoDeriv......

ICE冰焰火灵X
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部