zoukankan      html  css  js  c++  java
  • 什么是Handler(三)

    1.Looper当中loop()方法的作用

    2.什么是Message对象的Target

    3.处理一个Message的方法

     1 public static void loop() {  //静态方法
     2         final Looper me = myLooper(); //myLooper是根据已知的线程对象取出对应的Looper对象
     3         if (me == null) { //判断取出的Looper对象是否为空
     4             throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
     5         }
     6         final MessageQueue queue = me.mQueue; //取出Looper的消息队列
     7 
     8         // Make sure the identity of this thread is that of the local process,
     9         // and keep track of what that identity token actually is.
    10         Binder.clearCallingIdentity();
    11         final long ident = Binder.clearCallingIdentity();
    12 
    13         for (;;) {  //此循环是不停的从消息队列中取出消息,如果没有值就会阻塞
    14             Message msg = queue.next(); // might block 
    15             if (msg == null) {
    16                 // No message indicates that the message queue is quitting.
    17                 return;
    18             }
    19 
    20             // This must be in a local variable, in case a UI event sets the logger
    21             Printer logging = me.mLogging;
    22             if (logging != null) {
    23                 logging.println(">>>>> Dispatching to " + msg.target + " " +
    24                         msg.callback + ": " + msg.what);
    25             }
    26 
    27             msg.target.dispatchMessage(msg);//查看Message.java源码, 
    28             //一个Handler对应一个looper对象,一个looper对应一个MessageQueue对象,使用Handler生成Message, 所生成的Message对象的target属性, 就是该Handler对象
    29            //查看Handler的dispatchMessage方法, 得知用handlerMessage处理消息
    30 
    31             if (logging != null) {
    32                 logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
    33             }
    34 
    35             // Make sure that during the course of dispatching the
    36             // identity of the thread wasn't corrupted.
    37             final long newIdent = Binder.clearCallingIdentity();
    38             if (ident != newIdent) {
    39                 Log.wtf(TAG, "Thread identity changed from 0x"
    40                         + Long.toHexString(ident) + " to 0x"
    41                         + Long.toHexString(newIdent) + " while dispatching to "
    42                         + msg.target.getClass().getName() + " "
    43                         + msg.callback + " what=" + msg.what);
    44             }
    45 
    46             msg.recycle();
    47         }
    48     }    
  • 相关阅读:
    Chrome developer tool:本人钟爱的 console、Network 功能简谈
    Node.js:实现知乎(www.zhihu.com)模拟登陆,获取用户关注主题
    简谈 JavaScript、Java 中链式方法调用大致实现原理
    jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究
    jQuery UI 多选下拉框插件:jquery-ui-multiselect
    为什么 JavaScript 中基本数据类型拥有 toString 之类方法?
    谈谈 JavaScript 中的 this 指向问题
    重写和重载的区别
    JAVA的静态方法,静态变量,静态类。
    重载
  • 原文地址:https://www.cnblogs.com/iMirror/p/3963964.html
Copyright © 2011-2022 走看看