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指针将它们全部遍历。

  • 相关阅读:
    OGG实时同步Oracle数据到Kafka实施文档(供flink流式计算)
    Oracle exp导出加where指定条件
    oracle merge into的用法
    Oracle列转行函数LISTAGG() WITHIN GROUP ()的使用方法
    sql怎样查一个存储过程被谁调用
    Oracle JOB间隔时间详解
    如何在ORACLE下创建JOB,并且赋予ID号?
    DOS下查看进程对应的文件路径
    查询系统中运行的JOB
    plsql中书写一个简单的存储过程
  • 原文地址:https://www.cnblogs.com/jason31/p/9531224.html
Copyright © 2011-2022 走看看