zoukankan      html  css  js  c++  java
  • 关于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()。

  • 相关阅读:
    P4720 【模板】扩展卢卡斯
    P3211 [HNOI2011]XOR和路径
    ZOJ 3329 One Person Game
    CF817F MEX Queries
    P3239 [HNOI2015]亚瑟王
    P3412 仓鼠找sugar II
    P4111 [HEOI2015]小Z的房间
    P4008 [NOI2003]文本编辑器
    CF451E Devu and Flowers
    P3975 [TJOI2015]弦论
  • 原文地址:https://www.cnblogs.com/gengen1990/p/5843876.html
Copyright © 2011-2022 走看看