源码分析Handler机制

来源:互联网 发布:华为软件测试 编辑:程序博客网 时间:2024/05/22 07:44

Handler机制

  • Message(消息)
    • 消息的创建:
      • 调用Message.obtain()方法,当sPool消息池为空就创建消息对象
    • 消息的next属性:
      • 消息对象通过next属性指向下一个消息对象
    • 消息的when属性:
      • long类型变量when,记录自己发送时间
    • 消息的target成员变量:
      • 消息对象中有一个Handler类型的成员变量target
      • 这个target记录此消息对象是由哪个Handler创建的
      • 多个Handler对象给消息队列发送消息,最终消息由谁处理,取决于消息由谁发送。(谁发送谁处理)
      • 处理消息时调用Message.target.handleMessage();也就是Handler.handleMessage();
  • Handler(处理器)
    • Handler的创建:
      • 应用启动时候,ActivityThread主线程会创建Handler和MessageQueue,并启动Handler
    • handler发送消息:
      • Handler.sendMessage();发送消息
    • Handler处理消息:
      • Handler.handleMessag();处理消息
  • Looper(轮循器)
    • Lopper何时开始轮循:
      • 只有当主线程ActivityThread调用Looper.loop();才开始轮循
      • Looper.loop();是个while(true){}的死循环
    • Looper轮循的原理:
      • 由于android的内核是Linux,所以也继承了Linux的进程间通信机制–“管道”
      • 管道的原理:
        • 在内存中有一个特殊的文件,这个文件有两个句柄(引用),一个是读取句柄,一个是写入句柄。
        • 内存中会有一块共享空间和两个流,一个主线程的读操作,一个子线程的写操作
        • 只有当子线程进行写操作时,主线程才会进行写操作
      • Looper的原理:
        • 主线程Looper从消息队列读取消息,当读完所有消息时,进入睡眠,主线程阻塞。
        • 子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据
        • 主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠
  • MessageQueue(消息队列)
    • 消息队列的数据结构:
      • MessageQueue是个队列结构,但由于Message对象通过next指向下一个消息对象,所以又类似于单链表结构
    • 消息入队:
      • MessageQueue.enquqeueMessage(Message msg,long when);将消息入队
      • MessageQueue处理消息的顺序由when决定,when越小越靠前
      • 当(p == null || when==0 || when < p.when)将消息插入队首,优先处理
      • 否则比较when参数确定消息所在位置
1 0
原创粉丝点击