android.os.Looper:
注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。
<pre class="prettyprint" style="padding: 0px; margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; -ms-word-wrap: break-word;" name="code"><pre class="prettyprint" style="padding: 0px; margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; -ms-word-wrap: break-word;" name="code"><span style="font-size:18px;"><span class="pln" style="margin: 0px; padding: 0px; line-height: 1.5;">//Handler不带参数的默认构造函数:new Handler(),实际上是通过</span><span class="pln" style="margin: 0px; padding: 0px; line-height: 1.5;">Looper.myLooper()</span>来获取当前线程中的消息循环,<br style="margin: 0px; padding: 0px;" />//而默认情况下,线程是没有消息循环的,所以要调用<span class="pln" style="margin: 0px; padding: 0px; line-height: 1.5;"> </span><span class="typ" style="margin: 0px; padding: 0px; line-height: 1.5;">Looper</span><span class="pun" style="margin: 0px; padding: 0px; line-height: 1.5;">.</span><span class="pln" style="margin: 0px; padding: 0px; line-height: 1.5;">prepare</span><span class="pun" style="margin: 0px; padding: 0px; line-height: 1.5;">()来给线程创建消息循环,然后再通过,Looper.loop()来使消息循环起作用。</span><br style="margin: 0px; padding: 0px;" /></span>class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
另,Activity的MainUI线程默认是有消息队列的。所以在Activity中新建Handler时,不需要先调用Looper.prepare()。
android.os.Handler:
Handler用于跟线程绑定,来向线程的消息循环里面发送消息、接受消息并处理消息。
以下是不带参数的Handler构造器:
public Handler() {
if (FIND_POTENTIAL_LEAKS) {
final Class<? extends Handler> klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) == 0) {
Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
klass.getCanonicalName());
}
}
mLooper = Looper.myLooper();
if (mLooper == null) {
//如果当前线程里面没有消息循环的时候,系统抛出异常。即在一个线程里如果想用Handler来处理消息,是需要调用Looer.prepare()来创建消息循环的,而MainUI线程不需要。
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = null;
}
1、post(Runnable)
, postAtTime(Runnable, long)
, postDelayed(Runnable, long);
2、sendEmptyMessage(int)
, sendMessage(Message)
, sendMessageAtTime(Message, long)
, and sendMessageDelayed(Message, long)。
顾名思义就是消息队列,干什么用的 当然是存放消息用的