*/
public static final void loop() {
Looper me = myLooper();
+ if (me == null) {
+ throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
+ }
MessageQueue queue = me.mQueue;
+
+ // Make sure the identity of this thread is that of the local process,
+ // and keep track of what that identity token actually is.
+ Binder.clearCallingIdentity();
+ final long ident = Binder.clearCallingIdentity();
+
while (true) {
Message msg = queue.next(); // might block
- //if (!me.mRun) {
- // break;
- //}
if (msg != null) {
if (msg.target == null) {
// No target is a magic identifier for the quit message.
+ msg.callback + ": " + msg.what
);
msg.target.dispatchMessage(msg);
- if (me.mLogging!= null) me.mLogging.println(
+ if (me.mLogging != null) me.mLogging.println(
"<<<<< Finished to " + msg.target + " "
+ msg.callback);
+
+ // Make sure that during the course of dispatching the
+ // identity of the thread wasn't corrupted.
+ final long newIdent = Binder.clearCallingIdentity();
+ if (ident != newIdent) {
+ Log.wtf("Looper", "Thread identity changed from 0x"
+ + Long.toHexString(ident) + " to 0x"
+ + Long.toHexString(newIdent) + " while dispatching to "
+ + msg.target + " " + msg.callback + " what=" + msg.what);
+ }
+
msg.recycle();
}
}