Android Looper和Handler分析

 第一次接触android应用程序(这里指的是JAVA层的UI程序,也难怪了,Google放出的API就只支持JAVA应用程序了),很难搞明白内部是如何实现的。但是,从原理上分析,应该是有一个消息循环,一个消息队列,然后主线程不断得从消息队列中取得消息并处理之。

然而,google封装得太厉害了,所以一时半会还是搞不清楚到底是怎么做的。本文将分析android内的looper,这个是用来封装消息循环和消息队列的一个类,handler其实可以看做是一个工具类,用来向消息队列中插入消息的。好比是Windows API的SendMessage中的HANDLE,这个handle是窗口句柄。

那怎么往这个消息队列中发送消息呢??调用looper的static函数myQueue可以获得消息队列,这样你就可用自己往里边插入消息了。不过这种方法比较麻烦,这个时候handler类就发挥作用了。先来看看handler的代码,就明白了。

  1. class Handler{  
  2. ..........  
  3.   
  4. public Handler() {  
  5.   
  6.         if (FIND_POTENTIAL_LEAKS) {  
  7.             final Class<? extends Handler> klass = getClass();  
  8.             if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&  
  9.                     (klass.getModifiers() & Modifier.STATIC) == 0) {  
  10.                 Log.w(TAG, "The following Handler class should be static or leaks might occur: " +  
  11.                     klass.getCanonicalName());  
  12.             }  
  13.         }  
  14.   
  15.   
  16.         mLooper = Looper.myLooper();  
  17.         if (mLooper == null) {  
  18.             throw new RuntimeException(  
  19.                 "Can't create handler inside thread that has not called Looper.prepare()");  
  20.         }  
  21.   
  22.   
  23.         mQueue = mLooper.mQueue;  
  24.         mCallback = null;  
  25.     }  
  26.   
  27.   
  28.     public Handler(Looper looper) {  
  29.         mLooper = looper;  
  30.         mQueue = looper.mQueue;  
  31.         mCallback = null;  
  32.     }  
  33.   
  34.   
  35.   
  36. public Handler(Looper looper, Callback callback) {  
  37.         mLooper = looper;  
  38.         mQueue = looper.mQueue;  
  39.         mCallback = callback;  
  40.     }  
  41.   
  42.   
  43.   
  44. public final boolean sendMessage(Message msg)  
  45.     {  
  46.         return sendMessageDelayed(msg, 0);  
  47.     }  
  48.   
  49.   
  50. public final boolean sendMessageDelayed(Message msg, long delayMillis)  
  51.     {  
  52.         if (delayMillis < 0) {  
  53.             delayMillis = 0;  
  54.         }  
  55.         return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);  
  56.     }  
  57.   
  58.   
  59. public boolean sendMessageAtTime(Message msg, long uptimeMillis)  
  60.     {  
  61.         boolean sent = false;  
  62.         MessageQueue queue = mQueue;  
  63.         if (queue != null) {  
  64.   
  65.   
  66.             msg.target = this;  
  67.             sent = queue.enqueueMessage(msg, uptimeMillis);  
  68.         }  
  69.         else {  
  70.             RuntimeException e = new RuntimeException(  
  71.                 this + " sendMessageAtTime() called with no mQueue");  
  72.             Log.w("Looper", e.getMessage(), e);  
  73.         }  
  74.         return sent;  
  75.     }  
  76.   
  77.   
  78.   
  79.   
  80.   
  81. public void dispatchMessage(Message msg) {  
  82.   
  83.         if (msg.callback != null) {  
  84.             handleCallback(msg);  
  85.         } else {  
  86.   
  87.           if (mCallback != null) {  
  88.                 if (mCallback.handleMessage(msg)) {  
  89.                     return;  
  90.                 }  
  91.            }  
  92.   
  93.             handleMessage(msg);  
  94.         }  
  95.     }  
  96. ..........  
  97. }  

 讲了这么多,该怎么创建和使用一个带消息循环的线程呢?

  1.   
  2.   
  3. ....  
  4.   
  5. ... onCreate(...){  
  6.   
  7.   
  8.   
  9.   
  10. class ThreadWithMessageHandle extends Thread{  
  11.     
  12.   Looper myLooper = null;  
  13.   run(){  
  14.   Looper.prepare();  
  15.   myLooper = Looper.myLooper();  
  16.   Looper.loop();开启消息循环  
  17. }  
  18.   
  19.  ThreadWithMessageHandle  threadWithMgs = new ThreadWithMessageHandle();  
  20.  threadWithMsg.start();  
  21.  Looper looper = threadWithMsg.myLooper;  
  22.   
  23.   
  24.   
  25.   
  26.  Handler threadHandler = new Handler(looper);  
  27.  threadHandler.sendMessage(...)  
  28. }  
  29.   
  30.   
  31. }  
  32.   
  33.   
  34.   
  35. ...  

好了,handler和looper的分析就都这了,其实原理挺简单的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值