美文网首页
基础知识复习Handler

基础知识复习Handler

作者: 刘景昌 | 来源:发表于2021-03-09 13:58 被阅读0次

1.ThreadLocal

在ThreadLocal中我们主要关注的三个地方


image.png
  • ThreadLocalMap
    ThreadLocalMap 在哪里定义 ,在哪里引用?
    ThreadLocalMap的定义在ThreadLocal中但是他的引用是在Thread中
    ThreadLocalMap的Key是什么,适应ThreadID行不行 为什么?
    ThreadLocalMap的Key是ThreadLocal对象 value为用户的值
    不能使用ThreadId 因为如果使用ThreadId作为key那面一个Thread的ThreadMap就只能保存一个对象了 不能在保存第二个对象,而使用ThreadLocal对象作为key 那么在一个Thread的ThreadMap中是可以保存多个ThreadLocal 对象的
  • ThreadLocal的作用
    ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用。作用:提供一个线程内公共变量(比如本次请求的用户信息),减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度,或者为线程提供一个私有的变量副本,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响

2.handler的模型

image.png

3.Looper

  • Looper的创建时间


    image.png

    在App启动的时候在ActivityThread.Main()方法中调用 Looper.prepareMainLooer()创建

  • Looper.looper()

public static void loop() {
    final Looper me = myLooper();  //获取TLS存储的Looper对象 
    final MessageQueue queue = me.mQueue;  //获取Looper对象中的消息队列

    Binder.clearCallingIdentity();
    //确保在权限检查时基于本地进程,而不是调用进程。
    final long ident = Binder.clearCallingIdentity();

    for (;;) { //进入loop的主循环方法
        Message msg = queue.next(); //可能会阻塞 
        if (msg == null) { //没有消息,则退出循环
            return;
        }

        //默认为null,可通过setMessageLogging()方法来指定输出,用于debug功能
        Printer logging = me.mLogging;  
        if (logging != null) {
            logging.println(">>>>> Dispatching to " + msg.target + " " +
                    msg.callback + ": " + msg.what);
        }
        msg.target.dispatchMessage(msg); //用于分发Message 
        if (logging != null) {
            logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
        }

        //恢复调用者信息
        final long newIdent = Binder.clearCallingIdentity();
        msg.recycleUnchecked();  //将Message放入消息池 
    }
}

loop()进入循环模式,不断重复下面的操作,直到没有消息时退出循环
读取MessageQuene的下一条messahe
把Meaasge分发给对应target
把分发后Message回收到消息池,以便重复利用

4.Handler

消息发送调用链


image.png

5.MessageQueue

消息队列 消息机制的核心 也是java层与native层之间的纽带
他涉及到的native的方法有

private native static long nativeInit();
private native static void nativeDestroy(long ptr);
private native void nativePollOnce(long ptr, int timeoutMillis);
private native static void nativeWake(long ptr);
private native static boolean nativeIsPolling(long ptr);
private native static void nativeSetFileDescriptorEvents(long ptr, int fd, int events);

相关文章

网友评论

      本文标题:基础知识复习Handler

      本文链接:https://www.haomeiwen.com/subject/yjiqqltx.html