• 关于handler 和 looper 的问题


    重新去学习回顾looper和handler ,还是需要重新认识这个经常使用的机制。

    我首先是看任玉刚老师的书《android的开发艺术探索》的第十章。

    里面一句话开始说出了我们大概的理解
    ——handler的使用就是将一个人物切换到handler 所在的线程去执行。

    在里面,我们需要理解handler运行需要两个底层looper 和 messagequeue

    messagequeue,叫做消息队列,但是存储的不是真正的队列,而是单链表。

    looper,使用来处理消息,而且对应也是每个对应线程的一个特殊的threadlocal。

    整个过程,可以理解为:

    handler通过sendmessage把msg发送到messsagequeue,然后messagequeue的next方法调用looper去处理这个msg消息。接下来,就是looper会把消息发送回handler的dispatchmessage方法来处理

    但是有个地方,就是在dispatchmessage的msg.callback和Callback,两者间是有区别的,根据书上所说:

    自带的Callback,可以用来创建一个handler的实例但是不需要派生handler的子类。

    具体这个地方也需要理解。

    而looper要注意的是,因为这个类会不断无限循环调用方法,需要在完成所有事情后使用quit或quitsafely(在所有消息结束后立即退出looper)。

    handler 还有一个特殊的构造方法,就是

    public Handler(Looper looper){

    this(Looper looper,null,false);

    }

    这个也是解决我之前遇到过的一个异常:

    can't create handler inside thread that has not called looper.prepare()。

  • 相关阅读:
    Day3-B-Round Marriage CodeForces-981F
    Day3-A-Problem H. Monster Hunter HDU6326
    Day3-G
    Day3-I-Squares POJ2002
    Day3-M-Cable master POJ1064
    Day3-N
    Day3-O-Median POJ3579
    Day3-P
    Day3-L-Cup HDU2289
    LeetCode "Majority Element"
  • 原文地址:https://www.cnblogs.com/gengen1990/p/5843876.html
Copyright © 2020-2023  润新知