文档章节

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
异步任务的理解

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

yabushan
2016/04/02
17
0
typedef与char (*(*x())[5])()

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

bigfish__
2012/04/05
0
0
Android异步消息处理机制完全解析-Handler详解

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

javen205
2017/03/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
3
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
3
0
打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
4
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部