<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=Looper</id>
	<title>Looper - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=Looper"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=Looper&amp;action=history"/>
	<updated>2026-09-01T03:59:06Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=Looper&amp;diff=842&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 12:04 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=Looper&amp;diff=842&amp;oldid=prev"/>
		<updated>2015-05-06T12:04:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Looper的作用是在一个线程(thread)中循环取出消息并分发到对应的处理函数中去。&lt;br /&gt;
&lt;br /&gt;
线程通常是没有与之相关联的消息looper的，通过这个类则可以实现这一功能：&lt;br /&gt;
&lt;br /&gt;
1、在目的线程中调用prepare，创建一个looper并关联之&lt;br /&gt;
&lt;br /&gt;
2、调用loop使looper开始工作，开始消息的分发工作&lt;br /&gt;
&lt;br /&gt;
looper与所处理的消息大部分的交互都是通过 Handler这个类来实现的。&lt;br /&gt;
&lt;br /&gt;
典型的用法：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
  class LooperThread extends Thread {&lt;br /&gt;
      public Handler mHandler;&lt;br /&gt;
&lt;br /&gt;
      public void run() {&lt;br /&gt;
          Looper.prepare();&lt;br /&gt;
&lt;br /&gt;
          mHandler = new Handler() {&lt;br /&gt;
              public void handleMessage(Message msg) {&lt;br /&gt;
                  // process incoming messages here&lt;br /&gt;
              }&lt;br /&gt;
          };&lt;br /&gt;
         Looper.loop();&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
应用程序使用：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
    new LooperThread().start();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 一、prepare函数 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
 /** Initialize the current thread as a looper.&lt;br /&gt;
  * This gives you a chance to create handlers that then reference&lt;br /&gt;
  * this looper, before actually starting the loop. Be sure to call&lt;br /&gt;
  * {@link #loop()} after calling this method, and end it by calling&lt;br /&gt;
  * {@link #quit()}.&lt;br /&gt;
  */&lt;br /&gt;
public static void prepare() {&lt;br /&gt;
    if (sThreadLocal.get() != null) {&lt;br /&gt;
        throw new RuntimeException(&amp;quot;Only one Looper may be created per thread&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    sThreadLocal.set(new Looper());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sThreadLocal的定义：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
static final ThreadLocal&amp;lt;Looper&amp;gt; sThreadLocal = new ThreadLocal&amp;lt;Looper&amp;gt;();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ThreadLocal是jdk中的一个线程局部变量类，这里表示sThreadLocal是一个线程局部变量，即线程中均保持其独立的副本。&lt;br /&gt;
&lt;br /&gt;
而prepare中作做的则是创建了一个新的Looper并把这个对象赋予了线程局部变量sThreadLocal。&lt;br /&gt;
&lt;br /&gt;
== 二、loop函数 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Run the message queue in this thread. Be sure to call&lt;br /&gt;
 * {@link #quit()} to end the loop.&lt;br /&gt;
 */&lt;br /&gt;
public static void loop() {&lt;br /&gt;
    Looper me = myLooper();&lt;br /&gt;
    if (me == null) {&lt;br /&gt;
        throw new RuntimeException(&amp;quot;No Looper; Looper.prepare() wasn&amp;#039;t called on this thread.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    MessageQueue queue = me.mQueue;&lt;br /&gt;
&lt;br /&gt;
    Binder.clearCallingIdentity();&lt;br /&gt;
    final long ident = Binder.clearCallingIdentity();&lt;br /&gt;
    &lt;br /&gt;
    while (true) {&lt;br /&gt;
        Message msg = queue.next(); // might block&lt;br /&gt;
        if (msg != null) {&lt;br /&gt;
            if (msg.target == null) {&lt;br /&gt;
                // No target is a magic identifier for the quit message.&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            long wallStart = 0;&lt;br /&gt;
            long threadStart = 0;&lt;br /&gt;
&lt;br /&gt;
            msg.target.dispatchMessage(msg);&lt;br /&gt;
&lt;br /&gt;
            final long newIdent = Binder.clearCallingIdentity();&lt;br /&gt;
            if (ident != newIdent) {&lt;br /&gt;
                Log.wtf(TAG, &amp;quot;Thread identity changed from 0x&amp;quot;&lt;br /&gt;
                        + Long.toHexString(ident) + &amp;quot; to 0x&amp;quot;&lt;br /&gt;
                        + Long.toHexString(newIdent) + &amp;quot; while dispatching to &amp;quot;&lt;br /&gt;
                        + msg.target.getClass().getName() + &amp;quot; &amp;quot;&lt;br /&gt;
                        + msg.callback + &amp;quot; what=&amp;quot; + msg.what);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            msg.recycle();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
此函数的工作就是不停地从线程局部变量sThreadLocal中不断地取出消息，并分发，我们再来看一下分发函数：&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
//Handler.java&lt;br /&gt;
    public void dispatchMessage(Message msg) {&lt;br /&gt;
        if (msg.callback != null) {  //如果msg自带有callback&lt;br /&gt;
            handleCallback(msg);  //调用自带的callback&lt;br /&gt;
        } else {  //否则&lt;br /&gt;
            if (mCallback != null) {  //如果handler自带有callback&lt;br /&gt;
                if (mCallback.handleMessage(msg)) {  //调用handler自带的callback&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            handleMessage(msg);  //调用关联handler的handleMessage&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>