什么是Android Handler机制?

UI更新机制和消息处理机制。

角色和角色的生成

四个主要角色
  • Message:消息,包含Handler。
  • MessageQueue:消息队列。
  • Handler:包含MessageQueue,发送消息,处理消息。
  • Looper:包含MessageQueue,遍历MessageQueue,找到待处理的消息来处理。
角色的生成

Lopper:Looper通过prepare()方法生成,生成的时候创建MessageQueue,并且将Looper对象放到ThreadLocal(保存Thread相关数据的类)中,再次调用prepare()方法的时候会抛出运行时异常。
UI线程的Looper对象在线程创建的时候自动生成,并且调用Looper.loop()死循环遍历MessageQueue
关键代码如下:

//  Looper类private static void prepare(booleanquitAllowed) {  if(sThreadLocal.get() !=null) {    throw newRuntimeException("Only one Looper may be created per thread");  }  sThreadLocal.set(newLooper(quitAllowed));}private Looper(booleanquitAllowed) {  mQueue=newMessageQueue(quitAllowed);  mThread= Thread.currentThread();}

Handler生成的时候会通过Looper.myLooper()去取ThreadLocal中的Looper,如果取不到会抛出运行时异常,如果取到了就将自己的MessageQueue和Looper的MessageQueue进行关联。关键代码如下:

//  Handler类public Handler(Callback callback, booleanasync) {  ......  mLooper= Looper.myLooper();  if(mLooper==null) {    throw newRuntimeException(    "Can't create handler inside thread that has not called Looper.prepare()");  }  mQueue=mLooper.mQueue;  mCallback= callback;  mAsynchronous= async;}

Handler消息发送和处理过程

消息发送
  • 将Message加入Handler的MessageQueue
  • 将Message的Handler和发送消息的Handler关联(也就是Message对象持有发送它自己的Handler对象)
    关键代码如下:
//  Handler类public final boolean sendMessageAtFrontOfQueue(Message msg) {  MessageQueue queue = mQueue;  if (queue == null) {    RuntimeException e = new RuntimeException(    this + " sendMessageAtTime() called with no mQueue");    Log.w("Looper", e.getMessage(), e);    return false;  }  return enqueueMessage(queue, msg, 0);}private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {  msg.target = this;  if (mAsynchronous) {    msg.setAsynchronous(true);  }  return queue.enqueueMessage(msg, uptimeMillis);}
消息处理

前面提到,UI线程启动的时候就生成了该线程Looper对象,并且调用loop()方法死循环遍历MessageQueue,所以消息处理就是当遍历到某个Message的时候就调用Message关联的Handler的handleMessage()来处理它。

Tip:
若Handler引用了Activity,而Handler发送的消息在MessageQueue中一直未被处理,会导致Activity无法被回收。

更多相关文章

  1. android Looper类
  2. android ApiDemo学习(一)service——4 Messenger Service
  3. Android(安卓)原代码编后的目录分析
  4. Android(安卓)镜像文件生成流程
  5. Android(安卓)CreateBitmap
  6. Android(安卓)官方屏幕适配之ScreenMatch
  7. Android(安卓)RSA公钥加密
  8. 【开源项目2】Android推送框架 androidpn
  9. Android(安卓)基于ZXing的二维码扫描和生成

随机推荐

  1. android修改手机虚拟设备管理器路径
  2. android studio 使用adb命令传递文件到an
  3. Android与js交互实例
  4. Unity与Android的互相调用
  5. Android(安卓)平台软件兼容性问题凸显
  6. Android开发进阶:如何读写Android文件
  7. android shape图形整理
  8. [置顶] 我的Android博文整理汇总
  9. Android(安卓)BroadcastAnyWhere(Google
  10. 关于 android:layout_x 和 android:layou