文档章节

Handler的理解

新年
 新年
发布于 2015/02/15 10:35
字数 388
阅读 9
收藏 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 面试题之线程间通信机制

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

侯蛋蛋_
01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
24分钟前
0
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
59分钟前
1
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
1
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
1
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部