hander messagequeue loop

MessageQueue
              消息队列  存放hander 发布的消息 .消息队列 通常附属于某一个创建他的线程
Looper.myQueue 获取当前线程的消息队列. 如果没有queue就报异常.
android 启动时候 默认为UI Thread 创建一个关联的消息队列.用来管理 程序的一些上层组件
activities broadcast receivers 等等.你可以在自己的子线程创建hander 于UI thread 进行通讯.也就是说我们程序一启动我们的UI 线程也就是主线程 就会有一个消息队列.如果我们开启另外一个子线程 就不会有有messagequeue消息队列

Hander
     通过hander 你可以发布或者处理 一个消息或者一个runable 实例.每个hander 都会与 唯一的一个线程 以及改线程的消息队列 关联.当你创建一个hander 的时候 默认情况下 它将关联到创建它的这个线程 和该线程的消息队列.也就是说 你通过hander 发布消息的时候 消息将会发送到与它关联的这个消息队列.当然也之能处理改消息队列的消息.
也就是说 一个hander 对应一个线程以及附属于该线程的消息队列.
比如 我们现在有一个hander 对象 这个hander 在UI 线程创建 叫xh_hander .
  xh_hander 和娜个线程关联?
  用这个hander 发送消息的话 它将发送给那个线程的消息队列?
这时 我们用这个hander 对象发送消息 他有发送消息的方法.

hander  主要方法
      public final boolean sendMessage(Message msg)

消息放入hander 关联的消息队列.消息队列尾部
消息放进去的一段 消息不会阻塞.处理消息的一段就可能会有阻塞.
     
         public void handerMessage(Message msg)
关联到该消息队列的线程通过调用hander 的handermessage 放入接受和处理消息.通常需要子类化hander 实现handerMessage

Looper
          Looper 扮演一个Hander 和消息队列之间通讯桥梁的较色.程序组件 首先通过Hander把消息传递给Looper Looper 把消息放进队列.Looper也把消息队列里的消息 传递给所有Hander。Hander 接受到消息后调用handeMessage 进行处理.

可以通过Looper.myLoopger 获取当前线程的looper 实例.如果当前线程未关联一个looper实例 返回空 不会抛空指针异常.
可以通过静态方法 Loopger.getMainLooper 方法获取主线程的Looper 实例。主线程默认是有一个Looper 对象.但是我们的子线程是没有的.我们子线程如何获取Looper 对象.
如果一个线程中调用Looper.prepare 那系统就会自动为该线程建立一个消息队列.然后调用Looper.loop 之后进入了消息循环. 之后可以发消息 去消息 处理消息.这个如何发送消息 和如何处理消息 可以在其他线程中 通过hander 来做.但前提是我们的hander 知道这个子线程的looper.如果你不是在子线程运行 Looper.myLoopger 一般是得不到子线程的Looper.


你可能感兴趣的:(messagequeue)