zoukankan      html  css  js  c++  java
  • 安卓学习12

    handler机制
    1、handler是android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,android系统中的一个例子就是主线程中的所有操作都是通过主线程中的handler去处理的。

    2、Handler的运行需要底层的 messagequeue和 looper做支撑。

    3、
    3 .1 、首先说messagequeue,messagequeue 是 一 个 消 息 队 列 , 它是采用单链表的数据结构来存储消息的,因为单链表在插入删除上 的效率非常高。Meaasgequeue主要包含一个是插入消 息的 enqueuemessage方法,和一个取出一条消息的next方法。
    3.2、然后说 looper,looper在安卓的消息机制中是扮演着消息调度的角色,具体来说就是他会不停的从 messagequeue中查看 是否有新消息,如果有就会立刻处理,否则会一直阻塞在messagequeue的next那里。构成 一个 looper是需要一个 messagequeue,而构成一个 handler则需 要一个 looper,looper一般是调用Looper.prepare()方法使用 threadlocal在线程的ThreadLocalMap中存储一个looper的,线程中有了looper之后就可以在这个线程中创建一个 handler了。
    3.3、最后说 handler,hanlder的构成是需要一个 looper,主线程 之中,在activitythread的main方法中(程序入口)通过 looper.preparemainlooper在主线 程中存储一个 looper,而在子线程之中,我们则需要手动的通过 looper的 prepare在子线程中存储一个 looper,然后通过 looper.loop 开启一个消息循环。 handler发送消息的过程,handler.send (message)方法实际上是往构成他的 looper的 messagequeue中 插入了一条消息,在将这条消息插入 messagequeue中之前,他需 要将此消息的 target变量指向当前发它的 handler,looper发现构成它的 messagequeue中有消息时, looper的 loop方法就会从 messagequeue中取出这条消息,然后调 用 msg.target.dispatchmessage,即调用发送这个消息的 handler 的 dispatchmessage方法来处理这个消息,注意,dispatchmessage 方法是在构成 handler的 looper中的loop方法中调用的,所以处理消息的逻辑就切换到了handler所在的线程之中了。

  • 相关阅读:
    (OK) port_lighttpd_to_Android——没有基于android 4.4源码
    Linux添加头文件路径—INCLUDE_PATH
    (OK) 交叉编译hello.c for android (--sysroot),不使用Android.mk和ndk-build
    Building and running Node.js for Android
    编译node-v4.2.1,出现错误:undefined reference to getpwuid_r
    我为什么向后端工程师推荐Node.js
    (OK) 编译 pcre-8.37 静态库
    port_lighttpd_to_Android——基于android 4.4源码
    深受C/C++程序员欢迎的11款IDE
    推荐!国外程序员整理的 PHP 资源大全
  • 原文地址:https://www.cnblogs.com/092e/p/14916595.html
Copyright © 2011-2022 走看看