zoukankan      html  css  js  c++  java
  • android Handler, MessageQueue, Looper, Message 源码阅读

    handler中,主要的几个方法有以下几个:obtainMessage(), 通过调用Message.obtain()来从消息池中获取message实例;remove(), 包括removeCallbacks 和removeMessages等的各种组合, 通过messageQueue的实例去删除带有某种“what”标记、某种callback的message;构造方法,其中使用了this(),也就是调用同一个类里面的构造方法,多个构造方法是通过简单的调用复杂的这样实现重用的。参数包括synchronous, callback, looper等;post(), 其实就是发送Runnable的sendMessage(); sendEmptyMessage() 就是发送只有what参数的message(总之发送信息这系列的方法就是纠缠在一起的,最后都会到达一个enqueueMessage()方法,此方法在另一个类)。然后有一个用起来比较危险的sciccors方法以及它内部调用的写在类的最后的一个方法,没仔细看。有一个dispatchMessage()方法,用以处理message,它会检查message里的callback有没有实现,如果为空会再检查handler实例中的callback,再没有就会执行handleMessage(msg)。

    looper中最主要的就是prepare()和loop()方法。prepare()方法会将looper和线程绑定起来,而loop()方法中,会通过一个next()方法,不断地去读取msg,使消息循环起来。

    message通过message.target持有一个handler从而关联起来。message中的obtain()是比较常用的,它的参数包括what、arg1、arg2和callback等。

    messageQueue是一个消息队列,它的引用存在于looper和handler中,而且handler是从looper得到的该实例,从而可以实现用handler将消息传送到队列的效果。message中常用的方法还有enqueueMessage()、removeMessagesAndCallbacks()等。前者通过一个when参数判断新的message应该插入到哪个位置,比如说如果when=0,就直接让next指向此message,这样它将是下一个处理的message。后者大概就是不对messag进行处理,而只是简单地用next指针将它们全部遍历。

  • 相关阅读:
    WPF 如何引入外部样式
    jQuery插件-json2.js
    前端js几种加密/解密方法
    asp.net Web项目中使用Log4Net进行错误日志记录
    UpdateProgress
    UpdatePanel的简单用法(非嵌套)
    UpdatePanel的用法详解
    asp.net调用前台js调用后台代码分享
    JVM中的运行参数
    为什么要对jvm进行优化
  • 原文地址:https://www.cnblogs.com/jason31/p/9531224.html
Copyright © 2011-2022 走看看